14

Azure Active Directory に対して認証する ASP.NET MVC 5 アプリがあります。アプリ全体で SSL を有効にしたかったのです。したがって、次のようにグローバルフィルターを活用しました。

public class FilterConfig
{
    /// <summary>
    /// Registers the global filters.
    /// </summary>
    /// <param name="filters">The filters.</param>
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new RequireHttpsAttribute());
    }
}

この後、プロジェクトのプロパティで「SSLを有効にする」もtrueに設定しました。これにより、次の SSL URL -> https://localhost:34567 が得られました。プロジェクトを更新して、「プロジェクト URL」のサーバーの下にある「Web タブ」の下の IIS Express パスにこれを含めました。ただし、サイトを実行すると、次のエラーが発生します。

IDX10311: RequireNonce は 'true' (デフォルト) ですが、validationContext.Nonce は null です。nonce を検証できません。ノンスを確認する必要がない場合は、OpenIdConnectProtocolValidator.RequireNonce を「false」に設定します。

私は認証を持っています。サイトで有効になっています。Azure Active Directory を使用しています。

セキュリティコードは次のとおりです。

app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = clientId,
                Authority = authority,
                PostLogoutRedirectUri = postLogoutRedirectUri                    
            });

        app.UseWindowsAzureActiveDirectoryBearerAuthentication(
            new WindowsAzureActiveDirectoryBearerAuthenticationOptions
            {
                Audience = audience,
                Tenant = tenant,      
            });

認証。値は web.config から読み取られており、次のとおりです。

<add key="ida:ClientId" value="<some_guid>" />
<add key="ida:Audience" value="https://localhost:34567/" />
<add key="ida:AADInstance" value="https://login.windows.net/{0}" />
<add key="ida:Tenant" value="microsoft.onmicrosoft.com" />
<add key="ida:PostLogoutRedirectUri" value="https://localhost:34567/" />

次のように、エラー メッセージの指示に従って RequireNonce を false に設定してみました。

ProtocolValidator = new OpenIdConnectProtocolValidator
                {
                    RequireNonce = false
                }

しかし、これは無効なリクエストエラーを引き起こしました。

誰かがここで何が問題なのかを理解するのを手伝ってもらえますか? SSLが有効になるまで、すべてがうまくいきました。

4

8 に答える 8

6

ログインに成功した後でも、Web アプリケーションで [戻る] ボタンを数回押すと、このエラーを再現できます。これら2つのことを試すことができますか:以下のコードで:

app.UseOpenIdConnectAuthentication(
                new OpenIdConnectAuthenticationOptions
                {
                    ClientId = mViewWebSite.ClientId,
                    Authority = mViewWebSite.Authority,
                    PostLogoutRedirectUri = mViewWebSite.PostLogoutRedirectUri
                });

エラーが示唆するように、認証オプションのオンとしてプロトコルバリデーターを追加します。

ProtocolValidator = new Microsoft.IdentityModel.Protocols.OpenIdConnectProtocolValidator(){
                            RequireNonce = false
                        }

または通知を追加すると、このエラーをキャッチしてエラーページにリダイレクトできます。私はそれを優雅にするためにそうします。カタナの人が直すまで。

Notifications = new OpenIdConnectAuthenticationNotifications
                        {
                            AuthenticationFailed = context =>
                            {
                                context.HandleResponse();
                                context.Response.Redirect("/Error.aspx?message=" + context.Exception.Message);
                                return Task.FromResult(0);
                            }
                        },
于 2015-08-07T07:03:58.233 に答える
1

ここでの問題は単純です...これを理解するのに何時間もかかりました。ローカルでテストしていたので https がありませんでした。テスト中に https になるとは思っていなかったので、最初に Azure AD でアプリを作成したときに真実を伝えるために、単純な http にしました (replyUrl の HomePage Url、すべてのジャズをログアウト)。

その後、これを行った後、多くの人が得ている無限ループの問題に遭遇しました。それで、私は自分のローカルで証明書をモックすることにしました。それは無限のリダイレクトを取り除きましたが、別のものをもたらしました "IDX10311: RequireNonce is 'true'" 1

簡単に言えば、すべてのエンドポイントで AzureAD アプリを https にします。そしてワラ!

于 2017-11-28T14:16:35.333 に答える
1

Global.asax ファイルで次の方法を使用して、この問題を回避することができます。少なくとも、これはクライアントに例外を表示しません。ELMAH を使用して例外をキャッチします。

protected void Application_Error(object sender, EventArgs args)
    {
        var ex = Server.GetLastError();
        if (ex.Message.Contains("IDX10311:"))
        {
            Server.ClearError();
            Response.Redirect("https://www.yoursitename.com");                 
        }
于 2017-06-09T07:02:08.657 に答える