MicrosoftのOpenID Connectミドルウェアを最新バージョンのChrome(バージョン80以上)とともに使用すると、次の例外が発生することがあります。
IDX21323: RequireNonce is ‘System.Boolean’. OpenIdConnectProtocolValidationContext.Nonce was null, OpenIdConnectProtocol.ValidatedIdToken.Payload.Nonce was not null. The nonce cannot be validated. If you don’t need to check the nonce, set OpenIdConnectProtocolValidator.RequireNonce to ‘false’. Note if a ‘nonce’ is found it will be evaluated.
この記事では、このエラーのトラブルシューティング方法について説明します。
- MicrosoftのOpenID Connectミドルウェアを使用したASP .Net MVCアプリケーション
- Okta Classic Engine
ノンスクッキーは、MicrosoftのOpenIDConnectミドルウェアによって、リプレイ攻撃を軽減するために使用されます。この例外は通常、OpenIdConnectミドルウェアが無効なノンスまたは欠落しているノンスクッキーを検出した場合にスローされます。
ノンスクッキーが欠落している理由を説明する前に、まずミドルウェアがこのクッキーをいつ設定するかを理解する必要があります。
次の図では、ブラウザーがアプリケーションhttps://example.com/Account/LogOnにGETリクエストを送信しています。ユーザーが認証されていないため、アプリケーションはミドルウェアで構成されたOpenIDプロバイダー(ここではOkta)にリクエストをリダイレクトします。以下のハイライトされたリクエストでは、302エラーコードと場所がhttps://login.example.com/oauth2/default/v1/authorizeに設定されていることがわかります。アプリケーションミドルウェアは、OpenIdConnect.nonce Cookieも設定します。
ユーザーの認証に成功すると、OpenIDプロバイダーは「コード」(トークンと交換される)を含むPOSTリクエストをアプリケーションのコールバック(ここではhttps:// example.com/Account/Logon)に送信します。このアプリケーションドメインへのすべてのリクエストには、その特定のドメインに対して設定された有効期限が切れていないクッキーが含まれます。したがって、POSTリクエストにはノンスクッキーが含まれている必要があります。
アプリケーションミドルウェアは、このノンスクッキーをトークン内のノンスクレームと比較することで、このノンスクッキーをノンス検証に使用し、ノンスクッキーが見つからない場合のIDX21323エラーによるリプレイ攻撃とエラーを軽減します。
ノンスクッキーがありませんか?
Chromeバージョン80以降を使用しているときにノンスクッキーが欠落する理由の1つは、Chromeフラグ[SameSiteのないcookieはセキュアでなければならない]が[デフォルト]または[有効]に設定されているとき、secure属性がないとChromeはSameSite=Noneでクッキーを保存しないためです。secure属性は、URLの冒頭がhttps://の場合にのみ設定され、http://の場合には付与されません
URLに「chrome://flags」を入力するとフラグの一覧が表示されます。検索で該当のフラグを探してください。
Webサイトのトラフィックがすべてhttpsで行われていることを確認します。.net実装によっては、httpsを確保するためにアプリケーションで構成を修正する必要がある場合があります。
- 次の内容をStartup.csのConfiguration()に追加します。
AuthenticationType = "Cookies", // if it still fails, change it to "ApplicationCookie"CookieSameSite = SameSiteMode.None,CookieSecure = CookieSecureOption.Always
- さらに、次の内容をweb.configに追加します。
<system.web>
<sessionState cookieSameSite="None"/><httpCookies requireSSL="true" /></system.web>
- または、.AddCookie()を使用する代わりに、以下の内容を使用します。
.AddCookie(options => { options.Cookie.SameSite = SameSiteMode.None; options.Cookie.SecurePolicy = CookieSecurePolicy.Always; options.Cookie.IsEssential = true; });
Visual StudioまたはWindows VMでSSLが有効になっていない場合もあります。SSLを有効にしてhttpsを実装することで、問題が解決するはずです。
アプリケーションがプロキシやロードバランサーの背後に配置されている場合は、必ずhttpsの構成を確認してください。たとえば、AWSロードバランサーを使用している場合は、ロードバランサーとアプリサーバーの間で通信に使用するポートが80ではなく443であることを確認します。
環境でF5ロードバランサーを使用している場合は、必ずiRuleを適用して、SameSite=NONEでセキュアなノンスクッキーを設定してください。
