IdentityServer3 注销端点上没有自动重定向

Posted

技术标签:

【中文标题】IdentityServer3 注销端点上没有自动重定向【英文标题】:No auto-redirect on IdentityServer3 logout endpoint 【发布时间】:2017-06-16 07:21:03 【问题描述】:

我无法弄清楚我在这里做错了什么。我已经在身份服务器 3 中完成了几乎所有工作,并且我不认为自己是那里的新手,但是在使用生成的注销链接后,我真的很难从 javascript 应用程序自动重定向到我选择的重定向 URL。为简洁起见,省略了一些内容(例如完整的 jwt 令牌)。

这是我的要求:

https://identity.mysite.com/id/connect/endsession?id_token_hint=jwt-id-token&post_logout_redirect_uri=http://localhost:3000/

这是客户端配置:

new Client
            
                ClientName = "Website User",
                ClientId = "webuser",
                Flow = Flows.AuthorizationCode,
                RequireConsent = false,
                AllowedCorsOrigins = new List<string>()
                
                    CloudConfigurationManager.GetSetting("Auth:CorsOriginPrimary"),
                    CloudConfigurationManager.GetSetting("Auth:CorsOriginSecondary"),
                ,
                RedirectUris = new List<string>
                
                    CloudConfigurationManager.GetSetting("Auth:RedirectUri"),
                    CloudConfigurationManager.GetSetting("Auth:SecondaryRedirectUri"),
                    CloudConfigurationManager.GetSetting("Auth:TertiaryRedirectUri")
                ,
                ClientSecrets = new List<Secret>
                
                    new Secret(CloudConfigurationManager.GetSetting("WebUser:Secret").Sha256())
                ,
                PostLogoutRedirectUris = new List<string>
                
                    CloudConfigurationManager.GetSetting("Auth:WebPostLogoutUri"),
                    CloudConfigurationManager.GetSetting("Auth:WebPostLogoutUri:Local")
                ,
                AllowAccessToAllScopes = true
            ,

这是工厂配置 (CORS) 的内容:

var corsPolicy = new DefaultCorsPolicyService
            
                AllowedOrigins = new[]
                
                    "https://storageurl.blob.core.windows.net",
                    CloudConfigurationManager.GetSetting("Auth:CorsOriginPrimary"),
                    CloudConfigurationManager.GetSetting("Auth:CorsOriginSecondary")
                ,
                AllowAll = true
            ;

当然 AllowAll = true 只是我试图让它工作。

以下是相关的配置条目:

    <add key="Auth:RedirectUri" value="http://localhost:3000/_oauth/oidc/" />
    <add key="Auth:SecondaryRedirectUri" value="http://mysiteloc.com:3000/_oauth/oidc" />
    <add key="Auth:TertiaryRedirectUri" value="http://localhost:3000/_oauth/oidc"  />
    <add key="Auth:CorsOriginPrimary" value="http://localhost:3000" />
    <add key="Auth:CorsOriginSecondary" value="http://mysiteloc.com:3000" />
    <add key="Auth:WebPostLogoutUri" value="http://localhost:3000/" />
    <add key="Auth:WebPostLogoutUri:Local" value="http://mysiteloc:3000/" />

然后这里是日志。看起来 CORS 可能有问题,但我不确定。我原以为允许工厂配置和客户端配置中的起源就足够了,但我仍然遇到问题。

2017-01-30 16:52:14.2034 INFO: Redirecting to logout page
2017-01-30 16:52:14.2465 INFO: Logout prompt for subject: 2054e687-777b-4ca3-bb20-ee59d8a1dc28
2017-01-30 16:52:14.2465 INFO: EnableSignOutPrompt set to false, performing logout
2017-01-30 16:52:14.2465 INFO: Logout endpoint submitted
2017-01-30 16:52:14.2465 INFO: Logout requested for subject: 2054e687-777b-4ca3-bb20-ee59d8a1dc28
2017-01-30 16:52:14.2465 INFO: Clearing cookies
2017-01-30 16:52:14.2580 INFO: rendering logged out page
2017-01-30 16:52:14.5831 INFO: CSP Report endpoint requested
2017-01-30 16:52:14.5831 INFO: CSP Report data: "csp-report":"document-uri":"https://identity.mysite.com/id/logout","referrer":"http://localhost:3000/reservations/purchase","violated-directive":"script-src 'self' ","effective-directive":"script-src","original-policy":"default-src 'self'; script-src 'self' ; style-src 'self' 'unsafe-inline' ; img-src *; font-src 'self' https://storageurl.blob.core.windows.net/; report-uri https://identity.mysite.com/id/csp/report","blocked-uri":"eval","line-number":174,"column-number":361,"source-file":"https://identity.mysite.com/id/assets/scripts.2.5.0.js","status-code":0
2017-01-30 16:52:14.5831 INFO: Rendering 204
2017-01-30 16:52:14.7738 INFO: End session callback requested
2017-01-30 16:52:14.7738 DEBUG: No client end session iframe URLs

任何你能帮助我的事情都会很棒。我认为也许我需要在这里传递授权代码而不是实际的 ID 令牌,但我已经看到了其他示例,他们传递了 ID 令牌并且它工作正常。我错过了什么?

编辑:在 Chrome 中查看网络选项卡时,看起来原始的 endsession 端点将我重定向到 endsessioncallback?sid=[some-sort-of-id]。这是正常行为吗?

【问题讨论】:

另一个想法 - 当我提交 id_token_hint 参数时,我是否需要包含它是什么类型的令牌?例如,我需要在令牌前加上“Bearer”吗? 不,只是作为 jwt 的 id_token。 【参考方案1】:

https://identityserver.github.io/Documentation/docsv2/configuration/authenticationOptions.html

EnablePostSignOutAutoRedirect(默认:false)?

如果你的选项中没有触及这个属性,可能是这个。

【讨论】:

此属性已设置为 true,但没有任何区别。不过谢谢! 那么您需要提供更多详细信息以了解您所遇到的情况。你如何重定向到 identity.mysite.com/id/connect/endsession ? windows.location = 你的网址?如果您通过打开一个新选项卡并手动输入 id_token 和 url 来手动输入 endsession url,会发生什么?您是否看到注销屏幕或它是否失败?考虑到你在谈论 CORS,听起来你做错了什么。除非您执行 AJAX 调用而不是重定向,否则 CORS 不相关。 感谢您的评论!现在它只是 window.location = yoururl。如果有更好的通过 ajax 注销的方法,我很乐意这样做,因为用户无论如何都想注销,我不太关心向他们展示来自身份服务器的任何反馈。

以上是关于IdentityServer3 注销端点上没有自动重定向的主要内容,如果未能解决你的问题,请参考以下文章

IdentityServer3 注销功能不适用于 ASP.NET Core 客户端

带有IdentityServer3的Oidc-client - Angular2,如何正确注销和登录

Identity Server 3 Access Token Validation 端点因受众验证失败而失败

具有 OpenId owin katana 中间件的多个 MVC 应用程序的单个注销 Identity Server3

如何覆盖注销后重定向网址

我可以在没有客户端密码的情况下使用带有 PKCE 的 IdentityServer3 授权代码流吗?