【问题标题】:Alternative to use HttpContext in System.Web for Owin在 System.Web for Owin 中使用 HttpContext 的替代方法
【发布时间】:2014-07-04 10:58:35
【问题描述】:

ASP.NET 身份验证现在基于可在任何基于 OWIN 的主机上使用的 OWIN 中间件。 ASP.NET Identity对 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 项目的解决方案,这对我无效。

【问题讨论】:

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


    【解决方案1】:

    您可以使用OwinRequestScopeContext。这正是您正在寻找的。​​p>

    【讨论】:

    • +1 以获得良好的解决方案。我的理解是,有了 OWIN,授权过滤器就没有地方了。
    • @Freerider 看完this 看来授权过滤器还是要走的路。
    • @Morio 我同意你的看法。感谢发帖。
    • OwinRequestScopeContext.Current 始终为空。请帮忙。
    • 对我来说也是空的,很确定我在启动时也正确连接了它,哦,值得一试。
    【解决方案2】:

    This article 给了我解决方案:

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

    所以只需修改行:

    Guid userId = new Guid(HttpContext.Current.User.Identity.GetUserId());
    

    Guid userId = new Guid(actionContext.RequestContext.Principal.Identity.GetUserId());
    

    现在,不再需要对 System.Web 的引用。

    【讨论】:

      【解决方案3】:

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

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

      actionContext.Request.GetRequestContext().Principal.Identity
      

      actionContext.RequestContext.Principal.Identity
      

      actionContext.Request.GetOwinContext().Request.User.Identity 获得身份。这三个都会为您提供相同的身份对象。

      是的,OwinContext 也可以通过这种方式使用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        • 2021-09-30
        • 2014-12-18
        • 2021-09-11
        • 1970-01-01
        相关资源
        最近更新 更多