【问题标题】:Return a JWT after authenticating via Open Id通过 Open Id 进行身份验证后返回 JWT
【发布时间】:2020-05-01 05:03:45
【问题描述】:

我正在开发用户通过 Steam 登录的 ASP.NET Core Web API。

public void ConfigureServices(IServiceCollection services)
{
    // ...

    services.AddAuthentication(options =>
        {
            options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = SteamAuthenticationDefaults.AuthenticationScheme;
        })
        .AddCookie()
        .AddSteam(options =>
        {
            options.Events.OnAuthenticated = ctx => // Create user
        });

    // ...
}

目前我正在使用 cookie,并且身份验证和授权都可以正常工作。但我想使用 JWT。如果我简单地将AddCookie 替换为AddJwtBearer 我会得到以下异常:The authentication handler registered for scheme 'Bearer' is 'JwtBearerHandler' which cannot be used for SignInAsync

github issue 中,它说我需要一个 OpenID Connect 服务器,但我不明白为什么,因为如果我想自己编写 JWT 逻辑,我可以在 open id 回调中生成令牌并返回它给用户。还是我错过了什么?

【问题讨论】:

    标签: asp.net-core .net-core openid-connect aspnet-contrib


    【解决方案1】:

    查看@KévinChalet 对以下代码安全问题的评论。

    SteamAuthenticationOptions.Events.OnTicketReceived 中调用 HandleResponse,这样它就不会调用 SignInAsync 并且能够自己进行重定向以加入 jwt。

    public void ConfigureServices(IServiceCollection services)
    {
        // ...
    
        services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(options => // ...)
            .AddSteam(options =>
            {
                options.Events.OnAuthenticated = ctx =>
                {
                    var res = ctx.User[SteamAuthenticationConstants.Parameters.Response];
                    var players = res[SteamAuthenticationConstants.Parameters.Players];
                    var player = players.First.ToObject<SteamPlayer>();
                    // Create user and generate jwt, then
                    ctx.Request.HttpContext.Items["jwt"] = jwt;
                });
    
                options.Events.OnTicketReceived = ctx =>
                {
                    ctx.HandleResponse();
    
                    var jwt = ctx.Request.HttpContext.Items["jwt"] as string;
                    ctx.Response.Redirect(QueryHelpers.AddQueryString(ctx.ReturnUri, "token", jwt));
                    return Task.CompletedTask;
                };
            });
    
        // ...
    }
    

    挑战 Steam 后认证成功时,会生成一个 jwt 并将用户重定向到{ReturnUri}?token={jwt}

    【讨论】:

    • 我不推荐这种方法,因为提到了here
    猜你喜欢
    • 2016-06-25
    • 1970-01-01
    • 2019-09-15
    • 2016-12-25
    • 2018-12-09
    • 2017-06-12
    • 2019-09-13
    • 2016-04-01
    • 2012-11-23
    相关资源
    最近更新 更多