我正在使用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);
}
}
理想的工作流程是:
Cookie(保存JWT)与请求一起发送
Owin中间件对此进行拦截,将令牌从cookie中取出,并附加一个Authorization标头
API调用使用授权承载标头进行身份验证。
如果有人对我为什么这样做感到好奇....这样我的网站可以仅使用http cookie来存储令牌,然后从需要Bearer令牌的设备中发送该令牌
相反,我总是会未经授权获得401。我怀疑它试图在Owin拦截令牌之前对令牌进行身份验证吗?我不是很积极。
答案 0 :(得分:1)
我相信我已经解决了这个问题。这是一个两部分的问题。
在我的Startup.cs中,这段代码
TokenValidationParameters = new TokenValidationParameters
{
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtSecret)),
ValidateLifetime = true
}
});
导致Owin始终以未经授权的方式返回令牌。我一定在某个时候改变了这个,并且从未重新检查过。我检查了ValidIssuer和ValidAudience,我们一切都很好。
另一个难题是在JWT身份验证之前先加载我的自定义中间件服装。