web-dev-qa-db-ja.com

ドキュメントに記載されているように、Cognitoログアウトが機能しない

SAML IDプロバイダー(ADFS)で構成されたCognitoユーザープールがあり、フェデレーションユーザー(AD)として署名することはできますが、サインアウトが機能しません。

documentation に続いて、 https://my-domain.auth.us-west-2.amazoncognito.com/logout?client_id=63...ng&logout_uriにGETリクエストを送信します= http:%2F%2Fyahoo.com (いくつかのパブリックログアウトURIを使用)、クライアント(AngularJS 1.xアプリ)から、Locationヘッダーのような

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

(実際には、上記のような2つの要求があります)。

ADFSを介して再度ログインすると、AD資格情報の入力を求められません。つまり、ログアウトされていないようです。

私のユーザープールは説明されているように構成されています ここ (ステップ7を参照)、ここでEnable 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...  
10
sharpthor

このリダイレクトは、logout_uriパラメーターがAWS CognitoユーザープールのサインアウトURLのリストに記載されているものと正確に一致しない場合に必ず発生しますアプリクライアントの設定構成。

Cognitoでは、logout_uriまたはloginと同じ引数(つまり、redirect_uriおよびresponse_type)を使用してログアウトし、ログアウトしてユーザーをログイン画面に戻すことができます。 logout_uriが無効な場合は常に、再ログインフローを想定してこのリダイレクトを行い、ログイン引数の欠落に関するエラーを報告します。

SAMLについてはわかりませんが、実際にはエラーが発生し、適切にレポートされなかったために機能しないと推測しています。

5
DS.

/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

4
Ak S
@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

0
pramod sable

最後に、この問題を修正することができました。 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を単にuserに置き換えます。

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");

これに加えて、問題を引き起こしたコグニト構成の有効なサインアウトフローをチェックインするのを忘れていました。ログアウトがシームレスに機能し始めました。