通过 Open Id 进行身份验证后返回 JWT
Posted
技术标签:
【中文标题】通过 Open Id 进行身份验证后返回 JWT【英文标题】:Return a JWT after authenticating via Open Id 【发布时间】: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 回调中生成令牌并返回它给用户。还是我错过了什么?
【问题讨论】:
【参考方案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。以上是关于通过 Open Id 进行身份验证后返回 JWT的主要内容,如果未能解决你的问题,请参考以下文章