asp.net - Asp.Net Core 使用 Cookie 授权和 JWT 授权
问题描述
我正面临一个在我的应用程序中似乎无法解决的问题。现在,我对应用程序的 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"]))
};
});
编辑:
根据微软文章,我应该这样做:
[Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme + "," + JwtBearerDefaults.AuthenticationScheme)]
如果我从我的视图中发送 Ajax 请求,它仍然会显示 401 错误。当我从 Postman 发送包含 JWT 令牌的请求时,它确实有效。
我发现如果我只设置 JWT 不记名方案,该方案会正确应用并按预期对 JWT 令牌工作:
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
但是对于 Cookie 身份验证,它仅在我根本不指定任何方案时才有效,如下所示:
[Authorize]
这样做不起作用:
[Authorize(AuthenticationSchemes = CookieAuthenticationDefaults.AuthenticationScheme)]
JwtBearerDefaults
解决方案
推荐阅读
- python - 如何让动画在 PyQt5 Qt3D 中正常工作?
- python - 为什么导致 django RQ 变成:pickle 数据被截断?
- android - 错误:链接文件资源失败:守护进程:AAPT2 aapt2-3.2.0-alpha14-4748712-linux Daemon #0
- vba - 将任务从待办事项列表移动到“查询”任务文件夹
- ubuntu - Sed Md5Sum 命令
- python - import flask 给出 ImportError: No module named jinja2
- ionic-framework - Ionic2-3 - 保存“游戏进度”的最佳方式
- c++ - c++访问错误读取
- vue.js - 如何在不记住所有动作的名称的情况下调用 vuex 调度并将它们作为字符串从调度发送?
- r - 在 R 中使用 strptime() 从 12 小时格式转换为 24 小时格式时的 NA 值