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

问题描述 投票:4回答:1

我正在向ASP.NET Web API 4.6 OWIN移植一个ASP.NET Core 2.1应用程序。该应用程序基于JWT令牌工作。但是令牌通过cookie而不是标头传递。我不确定为什么不使用标题,这只是我必须处理的情况。

考虑不通过cookie进行身份验证。 Cookie仅用作转移媒体。在遗留应用程序中,CookieOAuthBearerProvider用于从cookie中提取JWT令牌。配置代码如下:

    app.UseJwtBearerAuthentication(
        new JwtBearerAuthenticationOptions
        {
            AuthenticationMode = AuthenticationMode.Active,
            AllowedAudiences = new[] { audienceId },
            IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
            {
                new SymmetricKeyIssuerSecurityTokenProvider(issuer, audienceSecret)
            },
            Provider = new CookieOAuthBearerProvider("token")
        });
}

CookieOAuthBearerProvider类源代码如下:

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);
    }

这个解决方案将更详细地讨论here

现在我需要为ASP.NET Core实现类似的解决方案。问题是UseJwtBearerAuthentication不再存在于ASP.NET Core中,我不知道如何引入自定义AuthenticationProvider。

任何帮助都非常感谢。

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

c# authentication cookies asp.net-core jwt
1个回答
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?

传递给optionsAddJwtBearer对象包含自己的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;
                }
            };
        });
}

通过设置context.Token,您告诉JwtBearer进程您自己负责提取令牌。

Here是一个有用的迁移文档,可以更详细地解释身份验证更改。

© www.soinside.com 2019 - 2024. All rights reserved.