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

Posted

技术标签:

【中文标题】尝试在 ASP.net Web API 中发生授权之前使用 OWIN 注入授权标头【英文标题】:Trying to inject Authorization header using OWIN before authorization happens in ASP.net Web API 【发布时间】: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);
        
    

理想的工作流程是:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

                    ValidateLifetime = true
                
            );

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

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

【讨论】:

以上是关于尝试在 ASP.net Web API 中发生授权之前使用 OWIN 注入授权标头的主要内容,如果未能解决你的问题,请参考以下文章

根据 ASP.NET Core 请求标头中提供的 API 密钥授权用户

asp.net web api 2 CORS 和身份验证授权配置

Angular MSAL AD 401 在 Angular 应用程序中未经授权,但在 Postman 中 200 正常 - ASP.NET Core Web API

ASP.NET Web API 授权令牌提前到期

通过js向授权的asp.net web api请求XLSX文件

ASP.NET Web API:返回 401/未授权响应的正确方法