Owin在System.Web中使用HttpContext的替代方案

本文关键字:HttpContext 方案 System Web Owin | 更新日期: 2023-09-27 18:11:22

ASP.NET身份验证现在基于OWIN中间件,该中间件可以在任何基于OWIN的主机上使用。ASP.NET标识不依赖System.Web.

我有一个AuthorizeAttribute过滤器,我需要在其中获取当前用户,并添加一些稍后由操作控制器检索的属性。

问题是我必须使用属于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项目提供一个解决方案,这对我来说无效。

Owin在System.Web中使用HttpContext的替代方案

您可以使用OwinRequestScopeContext。这正是你想要做的。

本文为我提供了解决方案:

Web API 2引入了一个新的包含Principal属性的RequestContext类。现在查找呼叫者身份的正确位置。这替换Thread.CurrentPrincipal的先前机制和/或HttpContext.User。如果您是编写代码以在Web API中验证调用方。

所以只需修改行:

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也可以通过这种方式使用。