【发布时间】:2019-01-16 17:14:35
【问题描述】:
我正在尝试让 IdentityServer4 在新的 .NET Core 2.1 应用程序中运行(它在 .NET Core 2.0 应用程序中完美运行)。我尝试了以下方法:
1)下载这个项目,也就是IdentityServer4应用:https://github.com/ghstahl/IdentityServer4-Asp.Net-2.1-Identity-Examples/tree/e0aeeff7e078aa082c8e16029dd2c220acc77d7b
2) 下载这个项目,它是使用 Identity Server4 应用程序的 MVC 应用程序:https://github.com/IdentityServer/IdentityServer4.Samples/tree/dev/Quickstarts/6_AspNetIdentity/src/MvcClient。
3) 将两个项目添加到同一个解决方案中。 MVC 项目使用 IdentityServer 项目进行认证;授权等
我必须进行以下更改:
1) 更改 IdentityServer 应用程序中包含的 Startup(AddIdentityServer 现在接受一个参数):
services.AddIdentityServer(options =>
{
options.UserInteraction.LoginUrl = "/Identity/Account/Login";
options.UserInteraction.LogoutUrl = "/Identity/Account/Logout";
})
2) 将 IdentityServer 应用配置为侦听端口 5000 并在身份服务器上禁用 SSL。
除注销功能外,一切都按预期开箱即用。当我在 MVC 应用程序中单击注销时;在 MVC 应用程序中调用以下代码:
public async Task Logout()
{
await HttpContext.SignOutAsync("Cookies");
await HttpContext.SignOutAsync("oidc");
}
然后用户被重定向到 IdentityServer 应用程序中的 Logout.cshtml。但是,他们必须再次单击注销(在 IdentityServer 应用程序上)才能真正注销,即他们在 MVC 应用程序中单击注销(第二点),然后在 IdentityServer 中注销(第一点)。
为什么最终用户必须注销两次?
【问题讨论】:
-
没用过,不过
SignOutAsync那个does not require the schema parameter超载了。 -
@bradbury9,你能详细说明一下吗?该链接中的所有 SignOutAsync 构造函数都至少接受一个参数。谢谢。
-
当然,它们是扩展方法,所以它的第一个参数是
HttpContext对象。我指的是this overload 可以叫System.Threading.Tasks.Task.SignOutAsync(HttpContext);oHttpContext.SignOutAsync();第一个直接调用静态方法,第二个直接使用扩展方法。 -
在这种情况下,您登录了两次:一次在 MVC 应用程序中,一次在 IS4 应用程序本身中。当您在 MVC 应用程序中点击
Logout时,您会注销 MVC 应用程序,但仍使用 IS4 登录。这有点像使用 Google 登录应用程序 - 您登录的是 Google 本身和使用 Google 的应用程序。当您退出使用 Google 的上述应用时,您不会同时退出 Google。 -
一般提示:打开浏览器的开发工具并查看网络选项卡。在那里你可以看到浏览器实际要去哪里,所以你可以很容易地看到它何时重定向回身份服务器。您还可以在此处查看 HTTP 响应标头,以便检查何时设置或清除 cookie。 – 这在调试身份验证流程相关问题时通常非常有用。
标签: c# asp.net-core identityserver4 asp.net-core-identity