我搞不懂这是怎么用的。
我见过的大多数例子都给出了"/signout-callback-oidc“的名称。这似乎表明它在这个过程中使用了OIDC中间件。如果我想返回到特定的客户端页面怎么办?
当我将IdentityServer的AccountOptions.cs属性AutomaticRedirectAfterSignOut设置为true时,自动重定向无法工作。此外,在注销期间,我不接收客户端的PostLogoutRedirectUri。
那么,该链接应该连接到OIDC中间件,还是可以用于重定向到客户端?
发布于 2018-03-05 20:10:47
您的客户端必须配置为请求对其中一个URI的回调,作为客户端启动的签出流的一部分。
IS4客户端可以为登录和签出配置允许的重定向URI列表,我猜这是您看到/signout-callback-oidc的地方--如果我没记错的话,文档或者Quickstart代码都使用它,但是这个特定的URI名称没有什么特别之处。(据我所知,这不是一些OIDC标准,也不是一个“知名”的名字,也不是任何类似的东西。)
拼图中缺少的部分是在客户端应用程序中配置OIDC。您没有提到客户端是什么样的应用程序,但是在ASP.NET核心中,在AddOpenIdConnect服务上有一个名为SignedOutCallbackPath的选项:
services.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies";
options.Authority = appConfig["OidcAuthority"];
options.ClientId = appConfig["OidcClientId"];
options.ClientSecret = appConfig["OidcClientSecret"];
// etc
options.SignedOutCallbackPath = "/jake-says-goodbye";
});这将导致OIDC实现向标识重定向URI的签出请求添加一个属性。只要您的应用程序正确地标识了自己,就像docs 这里中简要提到的那样,并且只要/jake-says-goodbye是IS4侧已批准的注销后重定向URI之一,您就应该得到所期望的回调。
(我特别提到了“正确”标识,因为根据我看到的github问题,基于JS的SPA客户端应用程序可能更难管理,而不是MVC在幕后为管理服务器到服务器OIDC交互所做的任何有用的事情。我不能这样说,因为我还没有必要用IS4实现任何SPA客户机。)
发布于 2018-03-07 16:54:41
问题是,您必须设置一个非常特定的参数,这样PostLogoutRedirectUri才能不显示为null,并且测试任何选项都会导致不得不通过大量的方法来设置它,其中大多数仍然导致null。由于我使用的是一个使用IdentityServer4的老客户端(为了使.NET 4.x MVC应用能够通过IdentityServer4进行身份验证,不能在这些项目中轻松地使用.NET Core --幸运的是,IdentityServer4仍然与旧的客户端代码兼容),触发签名的操作有两个相关的东西(您将在.NET 4.x中找到大量的代码示例,这些代码对您不适用):
使用此示例github中的signout()方法( IdentityServer3 MVC Owin示例客户机):https://github.com/IdentityServer/IdentityServer3.Samples/blob/master/source/Clients/MVC%20OWIN%20Client/Controllers/HomeController.cs,您可以从视图中的一个按钮触发该操作。
如果您这样做的话,客户端的私有中间件会拦截它:https://github.com/IdentityServer/IdentityServer3/issues/2687#issuecomment-194739035 --我没有使用存储的消息位,并且我添加了PostLogoutRedirectUri参数,而IdentityServer4 4的LogoutRequest模型不会在同一段中删除这一行:
n.ProtocolMessage.PostLogoutRedirectUri = "http://myredirectaddress/ActionToDoOnceReturned"; 您必须确保上述内容与客户端客户端配置中的PostLogoutRedirectUri匹配,否则它将再次为null,而且您将在所有其他参数中忽略它。例如,这些设置PostLogoutRedirectUri的方法不起作用:
n.ProtocolMessage.SetParameter("PostLogoutRedirectURI", "some URL");
n.ProtocolMessage.SetParameter("PostLogoutUri", "another URL");
n.ProtocolMessage.SetParameter("PostLogoutRedirectUri", "yet another URL that's going to be ignored by IdentityServer4");从那里开始,您将开始比赛,因为PostLogoutRedirectUri不再为null。还有几个注意事项:查看AccountOptions中的IdentityServer控制器文件夹。我将AutomaticRedirectAfterSignout设置为true (这是IdSrv最后注销页面中的Javascript使用的-如果设置了,脚本将使用PostLogoutRedirectUri将用户转发回客户端)。还有一个选项可以显示注销确认提示,如果您想要实际显示,请确保不要在Owin中设置id令牌提示(就在我们设置PostLogoutRedirectUri /由签名请求触发的部件的位置旁边)。如果您做了这两件事,AccountServices.BuildLogoutViewModel将在AccountController.logout()方法调用它时将提示返回给用户。谢谢aaronR对我关于这个部分的另一个问题的回答:
IdentityServer4注销 (id令牌提示告诉IdentityServer,签名请求是经过授权的,而不是试图骚扰您的系统/注销用户的恶意人员,如果没有提供,IdSrv将请求用户确认)。
最后,如果您对IdentityServer端在注销过程中发生的事情感到困惑,以及为什么会反复触发相同的方法:
第一次从客户端的私有中间件(在Signout()操作之后触发的代码)调用它。
它使用AccountService构建视图模型,以返回用户以进行注销确认。
用户单击该页面上的“是”将再次触发它。
它再次通过帐户服务方法,这一次设置bool以将注销确认显示为false。
它调用第二个注销方法,该方法具有传入的视图模型。
这一项触发外部标识提供程序签名。
外部标识提供程序将控制权返回给注销,从而再次调用该控件,再次调用第二个注销方法。
最后,它将把用户返回到IdentityServer的注销页面。如果设置了PostLogoutRedirectUri & AutomaticRedirectAfterSignOut是真的,那么页面上就会有javascript,它会自动将用户的浏览器转发给它。
由于一次要调试两个项目,以及所有这些设置重定向的可能方法(也必须匹配客户机/服务器端配置以避免为null),所以很容易混淆。
发布于 2018-09-17 03:14:48
概述
在设置IdentityServer时(假设它是一个单独的应用程序),在访问客户端的配置中有两个参数:RedirectUris和PostLogoutRedirectUris。这与用户对IdentityServer系统登录或注销后发生的情况相对应。
由于客户端应用程序可能有自己的cookie(或JWT令牌,或用于维护用户会话的任何东西),因此需要知道IdentityServer何时处理了登录并使用户数据可用。
默认的ASP.NET OpenID连接中间件使用yourapp.com/signin-oidc和yourapp.com/signout-callback-oidc端点来拦截和处理来自IdentityServer的登录/注销处理。这些端点与OpenID协议无关,如果您有自己的身份验证处理程序,可以将其设置为任意类型,但是如果使用默认的中间件,则必须在IdentityServer配置中将其设置为。
配置选项
但是,如果您仍然希望在OpenID连接注销完成后重定向用户,则有一个具体的选项:
services.AddOpenIdConnect(options =>
{
// your other options...
options.SignedOutRedirectUri = "/some-page-after-oidc-logout";
});微软文档
https://stackoverflow.com/questions/49117283
复制相似问题