在授权发生在 ASP.net Web API 之前尝试使用 OWIN 注入授权 header

Trying to inject Authorization header using OWIN before authorization happens in ASP.net Web API

我正在使用 Owin 进行 JWT 身份验证。我的所有请求都返回为“401 未经授权”。

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

使用 Bearer 令牌添加授权 Header 可以正常工作和授权。

中间件在每次请求时都会被命中,成功获取 cookie,并成功更新 header(在上下文 object 中)。


        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 中取出令牌并附加授权 header

  3. API 调用通过授权承载 header.

  4. 进行身份验证

如果有人对我为什么这样做感到好奇....这是为了让我的网站可以使用仅 http cookie 来存储令牌,然后从需要 Bearer 令牌的设备我可以发送相反。

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

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

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

                TokenValidationParameters = new TokenValidationParameters
                {
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSecret)),

                    ValidateLifetime = true
                }
            });

导致 Owin 总是 return 令牌未授权。我一定是在某个时候改变了这个并且从未重新检查过。我让它检查了 ValidIssuer 和 ValidAudience,我们又好了。

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