尝试在 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