19

我有一个配置了 SAML 身份提供程序 (ADFS) 的 Cognito 用户池,我可以将其作为联合用户 (AD) 进行签名,但注销不起作用。

按照文档,我向 https://my-domain.auth.us-west-2.amazoncognito.com/logout?client_id=63...ng&logout_uri=http:%2F%2Fyahoo.com发出 GET 请求(使用一些公共注销 uri),来自我的客户端(AngularJS 1.x 应用程序),我得到一个带有Location标头 的 302

https://my-domain.auth.us-west-2.amazoncognito.com/login?client_id=63...ng&logout_uri=http:%2F%2Fyahoo.com  

(事实上​​,我看到了 2 个类似上面的请求)。

当我重新登录(通过 ADFS)时,它不会提示输入我的 AD 凭据,即似乎我没有注销。

我的用户池按照此处所述进行配置(请参见步骤 7),其中选中了启用 IdP 注销流程,这也应该将用户从 ADFS 中注销。

有什么建议么?谢谢。

General
-------
Request URL: https://my-domain.auth.us-west-2.amazoncognito.com/logout?client_id=63...ng&logout_uri=http:%2F%2Fyahoo.com  
Request Method: GET  
Status Code: 302  
Remote Address: 54.69.30.36:443  
Referrer Policy: no-referrer-when-downgrade  

Response Headers
----------------
cache-control: private  
content-length: 0  
date: Fri, 20 Apr 2018 21:31:12 GMT  
expires: Thu, 01 Jan 1970 00:00:00 UTC  
location: https://my-domain.auth.us-west-2.amazoncognito.com/login?client_id=63...ng&logout_uri=http:%2F%2Fyahoo.com  
server: Server  
set-cookie: XSRF-TOKEN=...; Path=/; Secure; HttpOnly  
set-cookie: XSRF-TOKEN=""; Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/; Secure; HttpOnly  
status: 302  
strict-transport-security: max-age=31536000 ; includeSubDomains  
x-content-type-options: nosniff  
x-frame-options: DENY  
x-xss-protection: 1; mode=block  

Request Headers
---------------
:authority: my-domain.auth.us-west-2.amazoncognito.com  
:method: GET  
:path: /logout?client_id=63...ng&logout_uri=http:%2F%2Fyahoo.com  
:scheme: https
accept: application/json, text/plain, */*  
accept-encoding: gzip, deflate, br  
accept-language: en-US,en;q=0.9  
authorization: Bearer eyJra...  
cache-control: no-cache  
origin: https://localhost:8443  
pragma: no-cache  
referer: https://localhost:8443/logout  
user-agent: Mozilla/5.0...  
4

5 回答 5

17

只要参数与AWS Cognito 用户池应用程序客户端设置配置中的注销 URLlogout_uri中列出的内容不完全匹配,就会发生此重定向。

Cognito 允许使用logout_uri与 login 相同或相同的参数(即redirect_uriresponse_type)注销以注销并将用户带回登录屏幕。似乎每当logout_uri无效时,它都会假定重新登录流程,执行此重定向,然后报告有关缺少登录参数的错误。

至于 SAML,我不知道,但猜测它不起作用,因为实际上存在错误,只是没有正确报告。

于 2018-07-06T16:49:47.023 回答
5

/logout endpoint用户注销。它只支持 HTTPS GET。这是工作

示例请求 - 注销并重定向回客户端

它清除现有会话并重定向回客户端。这两个参数都是必需的。

GET https://<YOUR DOMAIN NAME>/logout?
client_id=xxxxxxxxxxxx&
logout_uri=com.myclientapp://myclient/logout

还要确保Logout URL 与 AWS Cognito APP 中的 SIGNOUT URL 相同

有关更多信息,请参阅AWS LOGOUT 终端节点

于 2018-07-25T11:07:44.197 回答
1

最后我能够解决这个问题。我从我的 windows server 2012 R2 的事件查看器中找到了问题的实际原因。它说明了有关失败的注销流程的以下详细信息。

SAML Single Logout 请求与登录的会话参与者不对应。请求者:urn:amazon:cognito:sp:userpoolid 请求名称标识符:格式:urn:oasis:names:tc:SAML:2.0:nameid-format:persistent,NameQualifier:SPNameQualifier:,SPProvidedId:登录会话参与者:计数: 1、[Issuer: urn:amazon:cognito:sp:userpoolid, NameID: (格式: , NameQualifier: SPNameQualifier: , SPProvidedId: )]

用户操作 验证声明提供者信任或信赖方信任配置是最新的。如果请求中的名称标识符与会话中的名称标识符仅通过 NameQualifier 或 SPNameQualifier 不同,请使用 AD FS 2.0 管理管理单元检查并更正名称标识符策略发布规则。

错误清楚地表明请求中的名称标识符与会话中的名称标识符仅通过NameQualifier不同。我已通过添加以下规则更正了信赖方信托的索赔签发选项卡中的此错误。以下规则在发出声明时将 user@myadfsdomain 替换为简单的用户。

c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname"]
 => issue(Type = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier", Issuer = c.Issuer, OriginalIssuer = c.OriginalIssuer, Value = RegExReplace(c.Value, "(?i)^myadfsdomain*\\", ""), ValueType = c.ValueType, Properties["http://schemas.xmlsoap.org/ws/2005/05/identity/claimproperties/format"] = "urn:oasis:names:tc:SAML:2.0:nameid-format:persistent");

除此之外,我忘记检查导致问题的 cognito 配置中的启用注销流程。注销开始为我无缝工作。

于 2019-07-01T10:40:40.770 回答
1

从这里的文档

https://docs.aws.amazon.com/cognito/latest/developerguide/logout-endpoint.html

如果你想

在此处输入图像描述

你的登录网址就像

"https://xxxx.auth.eu-west-1.amazoncognito.com/login?client_id=1234&response_type=token&scope=aws.cognito.signin.user.admin+email+openid+phone+profile&redirect_uri=http://localhost:3000/"

然后你的注销网址就像

"https://xxxx.auth.eu-west-1.amazoncognito.com/logout?client_id=1234&logout_uri=http://localhost:3000/";

注意区别

  • 登录 > 登录?和redirect_uri
  • 注销 > 注销?和 logout_uri

这些重定向/注销 uri 必须与您在 Cognito 中配置的内容相匹配。

在此处输入图像描述

如果你做得不对,你可能会得到奇怪的错误,比如

error=unauthorized_client

或者

Required String parameter 'response_type' is not present

谁知道还有什么。:o)

于 2021-03-23T18:43:56.540 回答
0
@RequestMapping(value = "/logout", method = RequestMethod.GET)
public void logout(HttpServletRequest request, HttpServletResponse response) {
    LOGGER.info("Logout controller");
    try {
        Cookie awsCookie = new Cookie("AWSELBAuthSessionCookie-0", "deleted");
        awsCookie.setMaxAge(-1);
        awsCookie.setPath("/");
        response.addCookie(awsCookie);
        Properties appProperties = new Properties();
        applicationPropertyConfigurer.loadProperties(appProperties);
        response.sendRedirect(appProperties.getProperty("logout.url"));
        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate, max-age=0");
        response.setHeader("Pragma", "no-cache");
        response.setDateHeader("Expires", -1);
        request.getSession().invalidate();

    } catch (IOException e) {
        LOGGER.error("Exception in redirecting to logout.url URL", e);
    }

}

//https://https://domain_name.auth.us-west-x.amazoncognito.com/logout?response_type=code&client_id=&redirect_uri=redirect_uri_should_be_present_in_cognito_user_pool_Callback URL&state=STATE&scope=openid

于 2020-02-13T10:57:28.753 回答