【问题标题】:In ASP.NET Core read JWT token from Cookie instead of Headers在 ASP.NET Core 中,从 Cookie 而不是 Headers 中读取 JWT 令牌
【发布时间】:2019-02-10 13:23:26
【问题描述】:

我正在将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】:

    在 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?

    传递给AddJwtBeareroptions 对象包含它自己的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 是一份有用的迁移文档,它更详细地解释了身份验证更改。

    【讨论】:

    • context.Token 在此范围内是否始终为空或为空?这就是为什么你要告诉 JwtBearer 进程你已经小心自己提取令牌的原因吗?之前或之后不会进行任何处理?
    • @BrettCaswell 是的,它通常是 null 或此处为空。您可以通过here源的最新GA来查看。
    猜你喜欢
    • 2019-08-03
    • 2021-10-27
    • 2018-06-16
    • 2016-09-25
    • 2020-08-22
    • 2021-02-20
    • 1970-01-01
    • 2023-02-14
    • 1970-01-01
    相关资源
    最近更新 更多