首页 > 解决方案 > 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

标签: asp.netasp.net-web-apiasp.net-corecookiesjwt

解决方案


推荐阅读