我的外部登录回调处理程序将成功设置 aspnet cookie,但不会重定向到授权端点以继续 OpenIddict 中的 OIDC 流程。例如,这个:
app.MapMethods("callback/login/github", new[] { HttpMethods.Get, HttpMethods.Post }, async (HttpContext context) =>
{
var result = await context.AuthenticateAsync(OpenIddictClientAspNetCoreDefaults.AuthenticationScheme);
var identity = new ClaimsIdentity(authenticationType: "ExternalLogin");
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, result.Principal!.FindFirst("id")!.Value));
var properties = new AuthenticationProperties
{
RedirectUri = result.Properties!.RedirectUri
};
// properties.RedirectUri ignored!!!
return Results.SignIn(new ClaimsPrincipal(identity), properties);
});
...向指定的重定向 URL 返回 200 OK 结果而不是 302,完全忽略传递给
Results.SignIn
的属性
问题是我的项目面向 .Net 6.x,但 7.x 中修复了一个错误,该错误允许 ASP.NET cookie 身份验证处理程序使用
AuthenticationProperties
中指定的重定向 URL。
这需要一段时间才能弄清楚,因为 OpenIddict 示例存储库的目标是 8.0,因此在此发布我自己的问题+答案,以帮助其他可能仍以 .Net 6.0 为目标的人。
解决方案是目标 7.x(或更高版本)或手动返回重定向结果,例如
await context.SignInAsync(new ClaimsPrincipal(identity), properties);
return Results.Redirect(properties.RedirectUri ?? "/");