Asp.Net核心使用Cookie授权和JWT授权

时间:2019-05-06 10:24:11

标签: asp.net asp.net-web-api asp.net-core cookies 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?


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

0 个答案:

没有答案