c# - 在 ASP.NET Core 中,从 Cookie 而不是 Headers 中读取 JWT token

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

我正在将 ASP.NET Web API 4.6 OWIN 应用程序移植到 ASP.NET Core 2.1。该应用程序基于 JWT token 运行。但是 token 通过 cookie 而不是 header 传递。我不确定为什么不使用 header ,这只是我必须处理的情况。

考虑身份验证不是通过 cookie 完成的。 cookie 仅用作传输媒体。在遗留应用程序中,CookieOAuthBearerProvider 用于从 cookie 中提取 JWT token 。配置代码如下:

    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 收到的 token 传递给 header 阅读器。

最佳答案

在 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 进程您已经自行提取 token 。

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

关于c# - 在 ASP.NET Core 中,从 Cookie 而不是 Headers 中读取 JWT token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52184431/

相关文章:

search - 从不同域检索 Cookie 值

c# - 使用按钮选择 Telerik 网格 - MVVM

ios - 我如何阻止某人使用我们的应用程序?

mysql - MySQL 的 ASP.NET 成员资格/角色提供程序?

authentication - 如何区分 Microsoft MSA 和 AAD 帐户

c++ - 如何(即使用什么工具)监视 Curl 发送的 header (Cookie 问题)

cookies - 检索到的 twitter oauth token 如何处理?

C# 更改 TableLayoutPanel 中表格单元格的背景颜色

c# - 具有特殊字符的 Asp.net C# 电子邮件地址

c# - 每个程序集一个命名空间?