我面临着一个在我的应用程序中似乎无法解决的问题。现在,我对应用程序的 MVC 部分使用 cookie 授权,对 Api 使用 JWT 令牌。到目前为止一切顺利,一切都按预期进行;我能够使用 cookie 授权方案授权我的 MVC 控制器,并且能够使用 JWT 授权方案授权我的 API。
但问题是:我的视图发出 Ajax 请求以从我的 Api 获取一些数据。每次发出请求时,都会出现未经授权的错误。发生这种情况是因为 Api 使用 JWT 方案。这里最好的解决方案是什么?我是否需要在本地创建 JWT 令牌,将其保存在单独的 cookie 中,然后在发送请求之前设置授权标头?就像这样:
// Attatch token to all requests
$(document).ajaxSend(function (event, xhr, options) {
xhr.setRequestHeader('Authorization', 'Bearer ' + '@Request.Cookies["Token"].Value');
});
或者我会将 Api 控制器的授权方案设置为 JWT 和 cookie?
启动.cs:
services.AddAuthentication()
.AddCookie()
.AddJwtBearer(cfg =>
{
cfg.TokenValidationParameters = new TokenValidationParameters()
{
ValidIssuer = _configuration["Tokens:Issuer"],
ValidAudience = _configuration["Tokens:Audience"],
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Tokens:Key"]))
};
});
Edit:
根据,我应该这样做:
[Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme + "," + JwtBearerDefaults.AuthenticationScheme)]
如果我从我的视图发送 Ajax 请求,它仍然显示 401 错误。当我从 Postman 发送包含 JWT 令牌的请求时,它确实有效。
我发现,如果我仅设置 JWT 承载方案,该方案就会正确应用并按 JWT 令牌的预期工作:
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
但对于 Cookie 身份验证,它仅在我根本不指定任何方案时才有效,如下所示:
[Authorize]
这样做是行不通的:
[Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)]
JwtBearer默认值