【发布时间】:2018-08-13 07:19:07
【问题描述】:
我遇到了一个问题,我似乎无法让我的 Identity Server 注销以首先显示确认信息。我从github下载了IdentityServer4的源代码,在Models文件夹中找到了参数:LogoutRequest.cs, ShowSignOutPrompt。 IdentityServer 中没有对它的引用,除了在注销期间检查它。
在调试中,我看到它是错误的。我不知道应该在哪里设置,我已经检查了服务器和客户端的客户端配置选项,以及服务器启动的选项。
我在客户端代码中找不到“ShowSignoutPrompt”的实例(我目前使用的是 IdentityServer3 Owin Hybrid 客户端示例)。
代码流程如下: 我们的默认布局中有一个按钮触发客户端的 AccountController.Signout():
public void Signout()
{
Request.GetOwinContext().Authentication.SignOut();
}
从那里开始,我不完全确定如何,但它命中的下一点是 IdentityServer 的 AccountController.Logout(string logoutId)。该方法构建注销提示视图(使用 AccountServices.BuildLogoutViewModelAsync 中的检查)并将其返回到用户的浏览器。不将 ShowSignoutPrompt 设置为 false 的唯一方法是将 PostLogoutRedirectUri 设置为“/signout-callback-oidc”。我不知道为什么。
当用户在上面生成的视图上单击“是”时,它会转到 IdSrvr 的 AccountController.Logout(LogoutInputModel 模型)。我正在尝试更改该方法的最后一行:
return View("LoggedOut", vm);
到:
return Redirect(vm.PostLogoutRedirectUri);
这里的另一个问题是 PostRedirectUri 在这里为空,即使我在客户端配置中设置了它(好吧,就此而言,Identity Server 的客户端配置也有它)。
【问题讨论】:
-
如果我将 PostLogoutRedirectUri 设置为“/signout-callback-oidc”,则它会成功显示注销提示,但随后会在 IdentityServer AccountController 中引发错误,因为 AccountService.BuildLoggedOutViewModelAsync 正在返回空视图模型。
-
我还在 IdentityServer 主机控制器文件夹中看到了 AccountOptions.cs。我目前的价值观是: ShowLogoutPrompt = true; AutomaticRedirectAfterSignOut = false;我很快就会尝试自动重定向,我想我太早了。
-
如果您使用外部身份提供者,其他人应该注意的是,AccountController 的 Logout(string logoutId) 方法实际上被调用了很多次 (3):1.第一次从客户端的 Signout() 方法触发。 2. 用户在确认注销视图上单击“是”后。 3. 在外部身份提供者在那端注销用户后返回控制权(由 Logout(LoggedOutViewModel) 方法触发。这可能会导致很多混乱。我还没有。
-
我在尝试注销以提示并返回客户端的注销页面时问了两个单独的问题,这个和这个:stackoverflow.com/questions/49117283/… 我已将以下标记为答案,因为它澄清了很多有点,如果这还不够信息,我也回答了另一个问题。
标签: .net identityserver4 asp.net-authentication