【问题标题】:Cognito logout does not work as documentedCognito 注销不像记录的那样工作
【发布时间】:2018-10-01 16:17:58
【问题描述】:

我有一个配置了 SAML 身份提供程序 (ADFS) 的 Cognito 用户池,我能够以联合用户 (AD) 的身份对其进行签名,但无法退出。

documentation 之后,我向 https://my-domain.auth.us-west-2.amazoncognito.com/logout?client_id=63...ng&logout_uri=http:%2F%2Fyahoo.com(使用一些公共注销 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 凭据,也就是说,我似乎没有注销。

我的用户池按照here 的描述进行配置(请参见步骤 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...  

【问题讨论】:

标签: amazon-web-services adfs cognito


【解决方案1】:

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

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

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

【讨论】:

  • 这正是我使用 ASP.NET Core 和身份验证中间件所体验到的。我收到相关错误,因为 Cognito 没有返回到我的应用进行重定向。
  • 是的,使用 Cognito 的行为非常可怕且违反直觉。当请求中缺少、无效或不允许的 URL logout_uri 时,它不会告诉您。它会隐式尝试重新登录您!
  • 我遇到了类似的问题。根据用户的角色,我们有不同的代码路径用于完整的注销过程,即多个可能的 logout_uri。其中之一未在 Cognito 中配置,导致将用户重定向到 Cognito 登录屏幕,并出现错误“必需的字符串参数 'redirect_uri' 不存在”。 (一个非常误导性的错误)。一旦我配置了丢失的 logout_uri,问题就消失了。
  • 啊。 logout_url 可能不会有一个字符的变化,即使是尾随的 /
【解决方案2】:

/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 Endpoint

【讨论】:

    【解决方案3】:

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

    SAML 单一注销请求与登录的会话参与者不对应。 请求者:urn:amazon:cognito:sp:userpoolid 请求名称标识符:格式:urn:oasis:names:tc:SAML:2.0:nameid-format:persistent, NameQualifier: SPNameQualifier: , SPProvidedId: 已登录的会话参与者: Count: 1, [Issuer: urn:amazon:cognito:sp:userpoolid, NameID: (Format: , NameQualifier: SPNameQualifier: , SPProvidedId: )]

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

    Error 明确表示请求中的名称标识符与会话中的名称标识符仅通过 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 配置中的启用注销流程。注销开始为我无缝工作。

    【讨论】:

    • 您是如何启用注销流程的?
    • 在 cognito 身份提供者部分,会有一个小复选框来启用注销流程。默认情况下不选中。检查它以启用注销流程。
    • 哦,好的,看到了。我正在使用 OIDC,这就是为什么我找不到它。就我而言,这似乎是 Cognito 的一个已知限制 - forums.aws.amazon.com/thread.jspa?messageID=882529
    【解决方案4】:

    来自这里的文档

    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)

    【讨论】:

      【解决方案5】:
      @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:/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

      【讨论】:

      • 文档中提到Cognito端点清除会话。它清除了什么会话?为什么我们需要像上面的代码一样手动删除?有什么区别?
      猜你喜欢
      • 1970-01-01
      • 2016-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多