【问题标题】:Trying to inject Authorization header using OWIN before authorization happens in ASP.net Web API尝试在 ASP.net Web API 中发生授权之前使用 OWIN 注入授权标头
【发布时间】:2019-09-26 15:29:28
【问题描述】:

我正在使用 Owin 进行 JWT 身份验证。我所有的请求都以“401 Unauthorized”的形式返回。

我正在尝试拦截对我的 Web 应用程序的所有请求,以便我可以从 cookie 中检索 JWT 令牌。

使用 Bearer 令牌添加授权标头可以正常工作并进行授权。

中间件在每次请求时都会被命中,成功抓取 cookie,并成功更新标头(在上下文对象中)。


        public void Configuration(IAppBuilder app)
        {
            app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
            {
                TokenValidationParameters = new TokenValidationParameters
                {
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSecret)),

                    ValidateLifetime = true
                }
            });

            app.Use(typeof(JWTMiddleware));

            var config = new HttpConfiguration();
            WebApiConfig.Register(config);

            app.UseWebApi(config);
        }


    public class JWTMiddleware: OwinMiddleware
    {
        public JWTMiddleware(OwinMiddleware next): base(next)
        {
        }

        public override async Task Invoke(IOwinContext context)
        {
            var name = "auth";
            var cookie = context.Request.Cookies[name];
            if (cookie != null)
            {
                if (string.IsNullOrEmpty(context.Request.Headers.Get("Authorization")))
                {
                    context.Request.Headers.Append("Authorization", "Bearer " + cookie);
                }
            }
            await Next.Invoke(context);
        }
    }

理想的工作流程是:

  1. Cookie(保存 JWT)随请求一起发送

  2. Owin 中间件截获这个,从 cookie 中取出令牌并附加一个 Authorization 标头

  3. API 调用通过 Authorization Bearer 标头进行身份验证。

如果有人好奇我为什么要这样做....这样我的网站就可以只使用 http cookie 来存储令牌,然后从需要不记名令牌的设备中发送它.

相反,我总是得到未经授权的 401。我怀疑它在被 Owin 拦截之前试图验证令牌?我不积极。

【问题讨论】:

    标签: c# asp.net-web-api owin


    【解决方案1】:

    我相信我已经解决了这个问题。这是一个两部分的问题。

    在我的 Startup.cs 中,这段代码

                    TokenValidationParameters = new TokenValidationParameters
                    {
                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSecret)),
    
                        ValidateLifetime = true
                    }
                });
    

    导致 Owin 始终将令牌作为未经授权返回。我一定在某个时候改变了这一点,并且从未重新检查过。我让它检查了 ValidIssuer 和 ValidAudience,我们又好了。

    另一个难题是在 JWT 身份验证之前先加载我的自定义中间件。

    【讨论】:

      猜你喜欢
      • 2012-04-30
      • 2014-05-24
      • 2011-06-08
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 2012-03-20
      • 2018-07-17
      相关资源
      最近更新 更多