Identity Server 4:从MVC客户端正确注销



IdentityServer 4中的注销功能出现问题。我的IS4应用程序主要是他们网站上教程的结果,所以他们并不是真正的自定义行为。我也使用ASP.net核心标识。我有一个MVC客户端(同样,基本上是项目模板(。我只是在"索引"页面的顶部添加了一个"注销"按钮,以便将当前经过身份验证的用户注销。

这是我的MVC客户端中的Logout方法:

public async Task Logout()
{
await HttpContext.SignOutAsync("Cookies");
await HttpContext.SignOutAsync("oidc");
}

这正是教程中所说的。

这是MVC客户端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应用程序的登出按钮。。。只有这样我才能正确注销。。。

我想要的是,当我点击MVC客户端上的注销按钮时,我会真正注销,并直接重定向到MVC客户端的主页(没有"您现在已注销"页面(

我是IS4和ADP.NET的新手,所以任何帮助都是非常受欢迎的。。。谢谢

以下是我解决这个问题的方法:

public IActionResult LogOff()
{
return new SignOutResult(new[] { "oidc", "Cookies" });
}

最好不要使用魔术字符串,而是:

return new SignOutResult(new[]
{
CookieAuthenticationDefaults.AuthenticationScheme, 
OpenIdConnectDefaults.AuthenticationScheme
});

你试过吗

public async Task<IActionResult> Logout()
{
await _signInManager.SignOutAsync();
return View("Logout"); // or whatever url Redirect("http://localhost:5011/Home/")
}

相关内容

  • 没有找到相关文章

最新更新