在ASP.NET Core中,从Cookie而不是标题中读取JWT令牌

时间:2018-09-05 11:48:59

标签: c# authentication cookies asp.net-core jwt

我正在将Provisional headers are shown Accept: application/json, text/plain, */* acl: private Content-Type: audio/mp3 key: voice_tests/sample.mp3 Origin: https://localhost:4200 policy:xxx Referer: https://localhost:4200/app/casting-setup/7782/29867 success_action_status: 201 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36 X-amz-algorithm: xxx X-amz-credential: xxx X-amz-date: xxx X-amz-expires: xxx X-amz-signature: xxx 应用程序移植到ASP.NET Web API 4.6 OWIN。该应用程序基于ASP.NET Core 2.1令牌运行。但是令牌通过cookie而不是标头传递。我不确定为什么不使用标题,这只是我必须处理的情况。

考虑不通过cookie进行身份验证。 cookie仅用作传输介质。在旧版应用程序中,使用JWT从cookie中提取CookieOAuthBearerProvider令牌。配置代码如下:

JWT

app.UseJwtBearerAuthentication( new JwtBearerAuthenticationOptions { AuthenticationMode = AuthenticationMode.Active, AllowedAudiences = new[] { audienceId }, IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[] { new SymmetricKeyIssuerSecurityTokenProvider(issuer, audienceSecret) }, Provider = new CookieOAuthBearerProvider("token") }); } 类源代码如下:

CookieOAuthBearerProvider

此解决方案在here上进行了更详细的讨论。

现在,我需要为ASP.NET Core实现类似的解决方案。问题是public class CookieOAuthBearerProvider : OAuthBearerAuthenticationProvider { readonly string _name; public CookieOAuthBearerProvider(string name) { _name = name; } public override Task RequestToken(OAuthRequestTokenContext context) { var value = context.Request.Cookies[_name]; if (!string.IsNullOrEmpty(value)) { context.Token = value; } return Task.FromResult<object>(null); } 中不再存在UseJwtBearerAuthentication,而且我不知道如何引入自定义AuthenticationProvider。

我们非常感谢您的帮助。

更新: 有a solution that tries to validate JWT by its own code。这不是我所需要的。我只是在寻找一种方法,将从cookie接收的令牌传递给标头读取器。

1 个答案:

答案 0 :(得分:5)

在ASP.NET Core 2.0中,对身份验证系统进行了一些大修。而不是使用例如UseJwtBearerAuthentication作为中间件,ASP.NET Core 2.0+使用DI进行配置。例如,这看起来像这样:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options => {
            // ...
        });
}

接下来,下一个问题将是:我们如何指示JwtBearer身份验证过程使用此新系统查看cookie?

传递给options的{​​{1}}对象包含其自己的AddJwtBearer属性,该属性使您可以自定义过程的各个部分。使用Events,您可以实现所需的目标:

OnMessageReceived

通过设置public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.Events = new JwtBearerEvents { OnMessageReceived = context => { context.Token = context.Request.Cookies["CookieName"]; return Task.CompletedTask; } }; }); } ,您会告诉JwtBearer进程您已经自己提取了令牌。

Here是有用的迁移文档,它详细说明了身份验证更改。