【发布时间】: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 拦截之前试图验证令牌?我不积极。
【问题讨论】:
标签: c# asp.net-web-api owin