首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IdentityServer4 PostLogoutRedirectUri

IdentityServer4 PostLogoutRedirectUri
EN

Stack Overflow用户
提问于 2018-03-05 18:36:45
回答 6查看 27.1K关注 0票数 19

我搞不懂这是怎么用的。

我见过的大多数例子都给出了"/signout-callback-oidc“的名称。这似乎表明它在这个过程中使用了OIDC中间件。如果我想返回到特定的客户端页面怎么办?

当我将IdentityServer的AccountOptions.cs属性AutomaticRedirectAfterSignOut设置为true时,自动重定向无法工作。此外,在注销期间,我不接收客户端的PostLogoutRedirectUri。

那么,该链接应该连接到OIDC中间件,还是可以用于重定向到客户端?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2018-03-05 20:10:47

您的客户端必须配置为请求对其中一个URI的回调,作为客户端启动的签出流的一部分。

IS4客户端可以为登录和签出配置允许的重定向URI列表,我猜这是您看到/signout-callback-oidc的地方--如果我没记错的话,文档或者Quickstart代码都使用它,但是这个特定的URI名称没有什么特别之处。(据我所知,这不是一些OIDC标准,也不是一个“知名”的名字,也不是任何类似的东西。)

拼图中缺少的部分是在客户端应用程序中配置OIDC。您没有提到客户端是什么样的应用程序,但是在ASP.NET核心中,在AddOpenIdConnect服务上有一个名为SignedOutCallbackPath的选项:

代码语言:javascript
复制
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客户机。)

票数 13
EN

Stack Overflow用户

发布于 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模型不会在同一段中删除这一行:

代码语言:javascript
复制
n.ProtocolMessage.PostLogoutRedirectUri = "http://myredirectaddress/ActionToDoOnceReturned"; 

您必须确保上述内容与客户端客户端配置中的PostLogoutRedirectUri匹配,否则它将再次为null,而且您将在所有其他参数中忽略它。例如,这些设置PostLogoutRedirectUri的方法不起作用:

代码语言:javascript
复制
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),所以很容易混淆。

票数 5
EN

Stack Overflow用户

发布于 2018-09-17 03:14:48

概述

在设置IdentityServer时(假设它是一个单独的应用程序),在访问客户端的配置中有两个参数:RedirectUrisPostLogoutRedirectUris。这与用户对IdentityServer系统登录或注销后发生的情况相对应。

由于客户端应用程序可能有自己的cookie(或JWT令牌,或用于维护用户会话的任何东西),因此需要知道IdentityServer何时处理了登录并使用户数据可用。

默认的ASP.NET OpenID连接中间件使用yourapp.com/signin-oidcyourapp.com/signout-callback-oidc端点来拦截和处理来自IdentityServer的登录/注销处理。这些端点与OpenID协议无关,如果您有自己的身份验证处理程序,可以将其设置为任意类型,但是如果使用默认的中间件,则必须在IdentityServer配置中将其设置为。

配置选项

但是,如果您仍然希望在OpenID连接注销完成后重定向用户,则有一个具体的选项:

代码语言:javascript
复制
services.AddOpenIdConnect(options => 
{
     // your other options...

     options.SignedOutRedirectUri = "/some-page-after-oidc-logout";
});

微软文档

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49117283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档