在我的 Blazor 应用中,我使用标识服务器 (identityserver.io( 作为外部服务来管理授权。
登录工作正常,但是当我尝试注销,然后尝试登录时,我直接登录而不要求任何用户名/pwd!我搜索了一个星期没有找到任何解决方案!
我使用以下代码:
var props = (returnUrl is null) ? null : new AuthenticationProperties()
{
RedirectUri = returnUrl
};
await HttpContext.SignOutAsync("Cookies");
await HttpContext.SignOutAsync("oidc", props);
我也尝试删除所有cookie,但是HttpContext.Request.Cookies没有cookie!
我还检查了以下链接: https://mcguirev10.com/2018/01/26/signoutasync-and-identity-server-cookies.html 但我看不出任何有帮助的东西!
仅供参考,这是我的设置方式:
private void ConfigureAuthentication(ServiceConfigurationContext context, IConfiguration configuration)
{
context.Services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies", options =>
{
options.ExpireTimeSpan = TimeSpan.FromDays(365);
//options.Cookie.Name = ".MyApp";
})
.AddOpenIdConnect("oidc", options =>
{
options.Authority = configuration["AuthServer:Authority"];
options.RequireHttpsMetadata = true;
options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
options.ClientId = configuration["AuthServer:ClientId"];
options.ClientSecret = configuration["AuthServer:ClientSecret"];
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.Scope.Add("role");
options.Scope.Add("email");
options.Scope.Add("phone");
options.Scope.Add("MyApp");
options.ClaimActions.MapAbpClaimTypes();
});
}
要在从IDS4 注销后通过单击链接Click here to return to the Interactive client ....
重定向回客户端应用程序,您应该在客户端配置中设置正确的PostLogoutRedirectUris
:
new Client
{
....
// where to redirect to after logout
PostLogoutRedirectUris = { "http://localhost:5002/signout-callback-oidc" },
....
},
在@McGuireV10的文章中,他使用的是身份服务器的演示服务器进行测试,并且使用interactive.confidential.short
客户端,无法设置该客户端的PostLogoutRedirectUris
,所以默认会https://localhost:5001/signout-callback-oidc
。您可以设置自己的身份服务器来测试方案。
您可以尝试这种方式进行注销。 它应该有效。
public class LogoutModel : PageModel
{
public async Task<IActionResult> OnGetAsync()
{
return SignOut(
new AuthenticationProperties
{
RedirectUri = "/"
},
OpenIdConnectDefaults.AuthenticationScheme,
CookieAuthenticationDefaults.AuthenticationScheme);
}
}
我编译了几个不同的源代码,这是我对 .Net Core 6 MVC 应用程序的解决方案:
-
帐户控制器中的注销操作:
public async Task Logout() { await HttpContext.SignOutAsync("Cookies"); await HttpContext.SignOutAsync("OpenIdConnect"); }
-
程序.cs和构建器中的其他配置。Services.AddAuthentication 和 AddOpenIdConnect 部分:
options.Events.OnSignedOutCallbackRedirect += context => { context.Response.Redirect(context.Options.SignedOutRedirectUri); context.HandleResponse(); return Task.CompletedTask; };
-
已更新 [身份服务器]。客户端的 ClientPostLogoutRedirectUris] 如下所示:
https://localhost:7015/注销-回调-oidc
appsettings.json 条目示例:
"SignedOutRedirectUri": "https://localhost:7015/"
就我而言,网站的主页允许匿名访问,注销后,IDS会重定向它。
脚注。从我读到的内容来看Microsoft更改了.NET Core中有关工作方式以及人们从其网站注销而不是从标识服务器注销的内容。
希望对某人有帮助。