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

时间:2019-05-08 20:22:06

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

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

我试图拦截对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调用使用授权承载标头进行身份验证。

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

相反,我总是会未经授权获得401。我怀疑它试图在Owin拦截令牌之前对令牌进行身份验证吗?我不是很积极。

1 个答案:

答案 0 :(得分:1)

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

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

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

                    ValidateLifetime = true
                }
            });

导致Owin始终以未经授权的方式返回令牌。我一定在某个时候改变了这个,并且从未重新检查过。我检查了ValidIssuer和ValidAudience,我们一切都很好。

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