代码之家  ›  专栏  ›  技术社区  ›  Afshar Mohebi

在ASP.NET核心从Cookie而不是头中读取JWT令牌

  •  3
  • Afshar Mohebi  · 技术社区  · 6 年前

    ASP.NET Web API 4.6 OWIN 应用于 ASP.NET Core 2.1 . 应用程序正在基于 JWT 代币。但是传入的令牌是通过cookie而不是头传递的。我不知道为什么不使用标题,这只是我必须处理的情况。

    CookieOAuthBearerProvider JWT公司 来自cookie的令牌。配置代码如下:

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

    厨具供应商 类源代码如下:

    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核心。问题是 UseJwtBearerAuthentication 不存在于 ASP.NET Core 我不知道如何引入一个自定义的身份验证提供者。

    非常感谢您的帮助。

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

    1 回复  |  直到 6 年前
        1
  •  20
  •   Kirk Larkin    6 年前

    在ASP.NET在Core2.0中,认证系统进行了一些大修。而不是使用例如。 UseJwtBearerAuthentication

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

    那个 options 正在传入的对象 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;
                    }
                };
            });
    }
    

    通过设置 context.Token

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