替代在System.Web中为Owin使用HttpContext

时间:2014-07-04 10:58:35

标签: c# asp.net asp.net-identity owin katana

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);
    }
}

注意:我发现this question,似乎是重复的,但要求为NancyFx项目提供解决方案,这对我来说无效。

3 个答案:

答案 0 :(得分:10)

您可以使用OwinRequestScopeContext。这正是你正在寻找的。

答案 1 :(得分:9)

This article为我提供了解决方案:

  

Web API 2引入了一个新的   RequestContext类,包含Principal属性。这是现在   寻找呼叫者身份的正确位置。这个   替换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的引用。

答案 2 :(得分:3)

阅读this后。在我看来,扩展AuthorizeAttribute仍然是要走的路。 但是,由于HttpContext是基于IIS的,我们希望从现在开始避免使用它。

传入了HttpActionContext。然后我们可以使用

actionContext.Request.GetRequestContext().Principal.Identity

actionContext.RequestContext.Principal.Identity

OR

actionContext.Request.GetOwinContext().Request.User.Identity 获得身份。这三个人都会得到相同的身份对象。

是的,OwinContext也是这样的。