我有一个配置了SAML身份提供程序(ADFS)的Cognito用户池,我可以将其签名为联合用户(AD),但注销不起作用。
在documentation之后,我向GET发出请求 https://my-domain.auth.us-west-2.amazoncognito.com/logout?client_id=63...ng&logout_uri=http:%2F%2Fyahoo.com(使用一些公共注销uri),来自我的客户端(一个AngularJS 1.x应用程序),然后我找回一个带有位置标题的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...
答案 0 :(得分:3)
只要logout_uri
参数与AWS Cognito用户池“应用程序客户端设置”配置中的“注销URL”中列出的参数不完全匹配,就会发生这种重定向。
Cognito允许使用logout_uri
或具有与login相同的参数(即redirect_uri
和response_type
)的注销来注销,并使用户返回到登录屏幕。看来logout_uri
无效时,它会假定重新登录流程,进行此重定向,然后报告有关缺少登录参数的错误。
对于SAML,我不知道,但是猜测它不起作用,因为实际上存在错误,只是没有正确报告。
答案 1 :(得分:3)
/logout endpoint
将用户注销。它仅支持HTTPS GET 。它正在工作
示例请求-注销并重定向回客户端
它清除现有会话并重定向回客户端。这两个参数都是必需的。
GET https://<YOUR DOMAIN NAME>/logout?
client_id=xxxxxxxxxxxx&
logout_uri=com.myclientapp://myclient/logout
还要确保注销URL也与AWS Cognito APP中的SIGNOUT URL相同。
有关更多信息,请参见AWS LOGOUT Endpoint
答案 2 :(得分:0)
最后,我能够解决此问题。我从Windows Server 2012 R2的事件查看器中找到了问题的实际原因。它说出有关失败的注销流程的以下详细信息。
SAML单一注销请求与登录的会话参与者不对应。 请求者:urn:amazon:cognito:sp:userpoolid 请求名称标识符:格式:urn:oasis:names:tc:SAML:2.0:nameid-format:persistent,NameQualifier:SPNameQualifier:,SPProvidedId: 登录的会话参与者: 计数:1,[发行者: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配置中签入启用签出流程。注销开始为我无缝地工作。
答案 3 :(得分: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:/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
答案 4 :(得分:0)
来自此处的文档
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/";
注意区别
那些重定向/注销 uri 必须与您在 Cognito 中配置的内容相匹配。
如果你没有做对,你可能会得到一些奇怪的错误
error=unauthorized_client
或
Required String parameter 'response_type' is not present
谁知道还有什么。 :o)