我遇到了IdentityServer 4中的注销功能的麻烦。 我的IS4应用程序主要是其网站上教程的结果,因此它们并不是真正的自定义行为。我也使用ASP.net Core Identity。 我有一个MVC客户端(同样,基本上是项目模板)。我只是在“索引”页面顶部添加了“注销”按钮,以注销当前已通过身份验证的用户。
这是我的MVC客户端中的注销方法:
public async Task Logout()
{
await HttpContext.SignOutAsync("Cookies");
await HttpContext.SignOutAsync("oidc");
}
这正是本教程所说的。
这是MVC Client的Startup.cs中的配置:
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies";
options.Authority = "http://localhost:5000";
options.RequireHttpsMetadata = false;
options.CallbackPath = new PathString("/Home/");
options.ClientId = "Core.WebUI";
options.ClientSecret = "secret";
options.ResponseType = "code id_token";
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.Scope.Add("offline_access");
});
没什么... 现在,IS4应用程序中的MVC客户端配置:
new Client
{
ClientId = "Core.WebUI",
ClientName = "MVC Client",
ClientSecrets = new List<Secret>
{
new Secret("secret".Sha256())
},
AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
RequireConsent = false,
// where to redirect to after login
RedirectUris = { "http://localhost:5011/Home/" },
// where to redirect to after logout
PostLogoutRedirectUris = { "http://localhost:5011/Home/" },
AlwaysSendClientClaims = true,
AlwaysIncludeUserClaimsInIdToken = true,
AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile
},
AllowOfflineAccess = true
}
同样,大部分都是本教程所说的。 我的问题是: 当用户连接后,然后单击注销按钮,我将被重定向到注销页面中的IS4应用程序,并说我已经注销了。但是实际上,我不是,因为如果返回我的MVC,我仍然可以访问受保护的功能(带有Authorize属性)。为了正确注销我的用户,一旦我进入D4应用程序的注销页面,我就必须单击IS4应用程序的注销按钮...只有这样我才能正确注销... < / p>
我想要的是,当我单击MVC客户端上的“注销”按钮时,我会真正注销,然后直接重定向到MVC客户端的主页(没有“您现在已注销”页面)
对于IS4和ADP.NET来说我还很陌生,因此非常欢迎提供任何帮助...谢谢!
答案 0 :(得分:1)
最好不要使用魔术字符串,而是:
return new SignOutResult(new[]
{
CookieAuthenticationDefaults.AuthenticationScheme,
OpenIdConnectDefaults.AuthenticationScheme
});
答案 1 :(得分:0)
您尝试过
8000
答案 2 :(得分:0)
这是我解决此问题的方法:
public IActionResult LogOff()
{
return new SignOutResult(new[] { "oidc", "Cookies" });
}