我面临的问题似乎无法在我的应用程序中解决。现在,我正在为我的应用程序的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?
Startup.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"]))
};
});
编辑:
根据Microsoft article,我应该这样做:
[Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme + "," + JwtBearerDefaults.AuthenticationScheme)]
如果我从视图发送Ajax请求,它仍然显示401错误。当我从Postman发送包含JWT令牌的请求时,它确实起作用。
我发现,如果仅设置JWT承载方案,则该方案将正确应用,并能按预期对JWT令牌运行:
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
但是对于Cookie身份验证,它仅在我完全不指定任何方案时才有效,例如:
[Authorize]
这样做不起作用:
[Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)]
JwtBearerDefaults