【发布时间】:2022-10-19 17:55:18
【问题描述】:
我正在通过 OpenID Connect (OIDC) 提供程序使用基于 cookie 的身份验证构建 Blazor Server ASP.NET Core 应用程序。注销时,我想重定向到 localhost URI:https://localhost:44378/signout-oidc。这是在 OIDC 提供商处注册为注销后重定向 URI 的路径。
当我注销时,我通过 Connect 提供商的注销流程发送,他们的日志状态为“结束会话请求验证成功”,但我最终在 URI 上:https://localhost:44378/signout-oidc? state=CfDJ8LdQ[...] 这是一个空白页。如果我在登录时尝试访问 https://localhost:44378/signout-oidc 我会得到Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler:错误:远程注销请求被忽略,因为缺少“sid”参数,这可能表示主动注销。
我尝试了无数种不同的组合来覆盖SignedOutRedirectUri、SignedOutCallbackPath、RemoteSignOutPath 等,以及重定向到其他页面 - 都无济于事。我的想法不多了,希望能提供各种意见。
我添加了配置 OpenID 身份验证的代码:
services.AddAuthentication(opt =>
{
opt.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
opt.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
opt.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
}).AddCookie("Cookies", options =>
{
options.Cookie.SameSite = SameSiteMode.None;
})
.AddOpenIdConnect("oidc", options =>
{
options.Authority = configuration.GetSection("AuthorizationStrings")["Authority"];
options.ClientId = configuration.GetSection("AuthorizationStrings")["ClientId"];
options.ClientSecret = configuration.GetSection("AuthorizationStrings")["ClientSecret"];
options.ResponseType = "code";
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.UseTokenLifetime = false;
options.Scope.Add("openid");
options.Scope.Add("profile");
options.TokenValidationParameters = new TokenValidationParameters { NameClaimType = "name" };
options.SignedOutCallbackPath = "/signout-oidc";
通过退出按钮启动的退出流程的代码。重定向 URI 的格式是 OIDC 提供者所期望的(状态参数是可选的,所以我省略了它):
public async Task OnGetAsync()
{
var ac = await HttpContext.GetTokenAsync("access_token");
String uri = String.Format("[CONNECT PROVIDER URI]/endsession?id_token_hint={0}&post_logout_redirect_uri=https://localhost:44378/signout-oidc", ac);
await HttpContext.SignOutAsync(CookieAuthenticationDefaults.AuthenticationScheme);
var prop = new AuthenticationProperties
{
RedirectUri = uri
};
await HttpContext.SignOutAsync("oidc", prop);
}
【问题讨论】:
标签: asp.net authentication cookies single-sign-on openid-connect