替代在System.Web中为Owin使用HttpContext
ASP.NET身份validation现在基于OWIN中间件,可以在任何基于OWIN的主机上使用。 ASP.NET Identity 对System.Web没有任何依赖 。
我有一个AuthorizeAttributefilter,我需要获取当前用户并添加一些属性以供操作控制器稍后检索。
问题是我必须使用属于System.Web的HttpContext。 对于Owin有没有HttpContext的替代方案?
public class WebApiAuthorizeAttribute : AuthorizeAttribute { public override async Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken) { base.OnAuthorization(actionContext); Guid userId = new Guid(HttpContext.Current.User.Identity.GetUserId()); ApplicationUserManager manager = new ApplicationUserManager(new ApplicationUserStore(new ApplicationDbContext())) { PasswordHasher = new CustomPasswordHasher() }; ApplicationUser user = await manager.FindByIdAsync(userId); actionContext.Request.Properties.Add("userId", user.LegacyUserId); } }
注意:我发现这个问题 ,似乎是重复的,但要求为NancyFx项目工作的解决方案,这对我来说无效。
您可以使用OwinRequestScopeContext 。 这正是你正在寻找的。
这篇文章给了我解决方案:
Web API 2引入了一个包含Principal属性的新RequestContext类。 现在这是查找调用者身份的正确位置。 这取代了Thread.CurrentPrincipal和/或HttpContext.User的先前机制。 如果您正在编写代码以在Web API中validation调用方,那么这也是您要分配的内容。
所以只需修改该行:
Guid userId = new Guid(HttpContext.Current.User.Identity.GetUserId());
通过
Guid userId = new Guid(actionContext.RequestContext.Principal.Identity.GetUserId());
现在,不再需要对System.Web的引用。
看完之后。 在我看来,扩展AuthorizeAttribute仍然是要走的路。 但是,由于HttpContext是基于IIS的,我们希望从现在开始避免使用它。
传入了一个HttpActionContext。然后我们可以使用
actionContext.Request.GetRequestContext().Principal.Identity
要么
actionContext.RequestContext.Principal.Identity
要么
actionContext.Request.GetOwinContext().Request.User.Identity
来获取身份。 这三个都将为您提供相同的身份对象。
是的,OwinContext也是这样的。