首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过Open Id鉴权后返回JWT

通过Open Id鉴权后返回JWT
EN

Stack Overflow用户
提问于 2020-01-14 21:01:40
回答 1查看 451关注 0票数 1

我正在开发一个ASP.NET核心网络应用程序接口,其中用户登录通过蒸汽。

代码语言:javascript
复制
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,身份验证和授权都工作得很好。但我想用JWTs。如果我简单地用AddJwtBearer替换AddCookie,我会得到以下异常:The authentication handler registered for scheme 'Bearer' is 'JwtBearerHandler' which cannot be used for SignInAsync

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

EN

回答 1

Stack Overflow用户

发布于 2020-01-29 07:27:42

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

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

代码语言:javascript
复制
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}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59734317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档