请大神,关于WEBAPI用户认证,在API里获取当前用户的问题

zjlme 2016-06-15 05:43:03
首先我自定义了一个用户身份验证,在这里我通过Authorization 的认证判断用户是否存在

public class BasicAuthorizeAttribute : System.Web.Http.AuthorizeAttribute
{
public override void OnAuthorization(System.Web.Http.Controllers.HttpActionContext actionContext)
{
//读取HEADER信息验证
if (actionContext.Request.Headers.Authorization != null)
{
string TicketInfo = actionContext.Request.Headers.Authorization.ToString();
//header里的 Authorization: ticket
if (ValidateUserTicket(TicketInfo))
{
IsAuthorized(actionContext);
//Users = "12";
}
else
{
HandleUnauthorizedRequest(actionContext);
}
}
else
{
HandleUnauthorizedRequest(actionContext);
}
}

protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
{
//var challengeMessage = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized);
//challengeMessage.Headers.Add("WWW-Authenticate", "Basic");
//throw new System.Web.Http.HttpResponseException(challengeMessage);

base.HandleUnauthorizedRequest(actionContext);
if (actionContext.Response.StatusCode == System.Net.HttpStatusCode.Unauthorized)
{
//401错误
//actionContext.Response.Result = new RedirectResult("/");
}
}

在写API接口的时候,因为已经加了BasicAuthorize认证了,那么在GET方法的时候怎么获取当前已经验证的用户信息呢?

[Auth.BasicAuthorize]
public class ValuesController : ApiController
{
// GET api/val
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
//在这里如何将在BasicAuthorize 用户认证的信息传递过来
}
...全文
2549 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_44909093 2019-06-01
  • 打赏
  • 举报
回复
https://www.hrefs.cn/article/netcore-swagger-webapi-doc,webapi首先得用swagger接口化,然后解决其他问题吧。
  • 打赏
  • 举报
回复
你这是openid的认证方法,建议你看看openid的实现和文档,你就知道该怎么做了。 auth2.0和openid是现在流行的两种认证方案,你不太认可微软整合的aoth2.0那就看看openid吧。 当然,实现好的identityserver也已经出来很多年了,你也可以直接用。
江湖评谈 2017-12-06
  • 打赏
  • 举报
回复
aith应该也是递归链的一种,在路上,回去看看
zwei61 2017-12-06
  • 打赏
  • 举报
回复
参考:https://www.cnblogs.com/huangenai/p/5253709.html public static void SetPrincipal(IPrincipal principal) { Thread.CurrentPrincipal = principal; if (HttpContext.Current != null) { HttpContext.Current.User = principal; } } //验证用户session var userSession = authenticationService.GetUserDevice(sessionKey); if (userSession == null) { throw new ApiException("无此 sessionKey", "RequireParameter_sessionKey"); } else { //todo: 加Session是否过期的判断 if (userSession.ExpiredTime < DateTime.UtcNow) throw new ApiException("session已过期", "SessionTimeOut"); var logonUser = authenticationService.GetUser(userSession.UserId); if (logonUser != null) { filterContext.ControllerContext.RouteData.Values[LogonUserName] = logonUser; SetPrincipal(new UserPrincipal<int>(logonUser)); } userSession.ActiveTime = DateTime.UtcNow; userSession.ExpiredTime = DateTime.UtcNow.AddMinutes(60); authenticationService.UpdateUserDevice(userSession); }
xiaoshuai88888 2017-06-09
  • 打赏
  • 举报
回复
我也遇到了这个问题,想问下楼主解决了吗? 我现在打算在接口里再解析一次token来获取用户信息,目前没有想到更好的解决办法
peng2739956 2017-04-07
  • 打赏
  • 举报
回复
MVC 不太熟 @娃都会打酱油了 @caozhy
by_封爱 2017-04-07
  • 打赏
  • 举报
回复
没用过帮你顶一下. --------------------------------------------分割线-------------------------------------------- 不过我个人觉得 虽然微软提供了一些解决方案.但是我们是为了实现功能没有必要采用他的. 因为你这些东西 都是给客户端调用的 你只关心客户端是谁即可. 比如我们现在经常用的接口 都会带上token或者在header里面添加一个key=guid的东西. 这样你通过token或者key就知道了是哪个app 这个app属于哪个用户. 无非就是你费劲的重新查询一次.但是对于整体架构来说是合理的. 因为你是服务端 也就是架构的设计者..你说的算而不是非得单一采用某种方式. 你无非就是想在服务端生成一个东西 以后客户端在请求的时候 必须带着这个东西,来判断用户标识 相反的.市面常用的这么多接口中 大体都是我说的方式. 而这么多年 我还真没见过你这种认证方式在实际应用有体现..
  • 打赏
  • 举报
回复
这个问题我也纠结了好久,网上找了好久,没有相关的帖子,看到这个帖子,还没有具体的解决办法,最后,通过重新获取Headers里的Authorization 信息,再进行解析来获取用户的信息。
var Authorization = Request.Headers.Authorization;
;不知道有没有其他的方法来解决。
旋风小伙 2016-11-03
  • 打赏
  • 举报
回复
同求啊,已经为这个问题纠结了好几天了
cai3759 2016-08-09
  • 打赏
  • 举报
回复
这个现在你怎么处理的呀,刚好我也有这个需求
zjlme 2016-06-16
  • 打赏
  • 举报
回复
自己再顶一下
zjlme 2016-06-16
  • 打赏
  • 举报
回复
拜托各位大神指点一下, 小弟只有这么点分了,谢谢!
zjlme 2016-06-15
  • 打赏
  • 举报
回复
在线等大神!

62,243

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧