36

MVC 2 アプリケーションがあり (基本的な MVC 2 アプリでこれを試しましたが、余分なものはありませんが、同じ問題がありました)、ユーザーの認証に adfs 2 を使用しています。

ID3206 : SignInResponse メッセージは、現在の Web アプリケーション内でのみリダイレクトできます: '/[app]' は許可されていません。説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。例外の詳細: Microsoft.IdentityModel.Protocols.FederationException: ID3206: SignInResponse メッセージは、現在の Web アプリケーション内でのみリダイレクトできます: '/[app]' は許可されていません。

私はこれに関するほとんどのブログを読み、そのうちの 1 つに投稿しました。

    <federatedAuthentication>
            <wsFederation passiveRedirectEnabled="true" issuer="https://auth.[domain]/adfs/ls/" realm="https://[development domain]/[app]/" requireHttps="true" />
            <cookieHandler requireSsl="true" />
          </federatedAuthentication>
<audienceUris>
    <add value="https://[development domain]/[app]/" />
  </audienceUris>
  1. realm と AudienceUris の末尾にスラッシュがあります。
  2. 彼が提案したものを Application_BeginRequest に追加しました。次に、証明書がある [開発ドメイン] にコードをコピーしました。その後、無限ループに陥ります。
  3. また、ジュネーブ サーバーで自分の証明書利用者を確認しました。識別子とエンドポイント (POST) はどちらも https://[開発ドメイン]/[アプリ]/ で、末尾にスラッシュが付いています。

MVC アプリケーションであるという事実に問題があると思います。多数の Claims Aware Web サイトを作成し、default.aspx ページでクレームなどを取得しました。私の考えでは、MVC アプリに関連するルーティングが何らかの形で間違ってポストバックしていると思いますか?

しばらく静かにこれを見ているので、どんな助けも本当に感謝しています..

J

4

5 に答える 5

36

私はこれで髪を引き裂いています。私も構成で指定された末尾のスラッシュを持っています。私の場合、ブラウザで末尾のスラッシュを使用してアプリに移動すると、次のようになります。

http://localhost/myapp/

動作しますが、

http://localhost/myapp

しない。

これが事実である理由をさらに掘り下げることができれば、なぜこれが起こっているのかについての背景を追加します.

于 2012-03-10T16:27:06.303 に答える
18

RedirectToIdentityProviderのon サブクラスをオーバーライドしますWSFederationAuthenticationModule。これは、STS にリダイレクトする前に 1 回だけ発生します。FixedWSFederationAuthenticationModuleデフォルトの代わりにこのクラスを使用するように構成ファイルに指示する必要がありますWSFederationAuthenticationModule

public class FixedWSFederationAuthenticationModule : WSFederationAuthenticationModule
{
    public override void RedirectToIdentityProvider(string uniqueId, string returnUrl, bool persist)
    {
        //This corrects WIF error ID3206 "A SignInResponse message may only redirect within the current web application:"
        //First Check if the request url doesn't end with a "/"
        if (!returnUrl.EndsWith("/"))
        {
            //Compare if Request Url +"/" is equal to the Realm, so only root access is corrected
            //https://localhost/AppName plus "/" is equal to https://localhost/AppName/
            //This is to avoid MVC urls
            if (String.Compare(System.Web.HttpContext.Current.Request.Url.AbsoluteUri + "/", base.Realm, StringComparison.InvariantCultureIgnoreCase) == 0)
            {
                //Add the trailing slash
                returnUrl += "/";
            }
        }
        base.RedirectToIdentityProvider(uniqueId, returnUrl, persist);
    }
}
于 2012-11-05T11:33:29.663 に答える
10

このコードはそれを処理します(global.asaxに入れます):

private void Application_BeginRequest(object sender, EventArgs e)
{
//  This corrects WIF error ID3206 "A SignInResponse message may only redirect within the current web application: '/NHP' is not allowed."
//  For whatever reason, accessing the site without a trailing slash causes this error.
if (String.Compare(Request.Path, Request.ApplicationPath, StringComparison.InvariantCultureIgnoreCase) == 0 && !(Request.Path.EndsWith("/")))
Response.Redirect(Request.Path + "/");
}

編集:

チェックするもう1つのことは、Web.configのmicrosoft.identityModelのfederationAuthentication/wsFederation要素です。発行者とレルムが正しいことを確認します。

于 2012-10-26T13:59:21.960 に答える
5

WIF でフォーム認証を使用しています。フォーム認証モジュールは、承認されていない要求を正しいコントローラーにリダイレクトし、最初に要求された URL をReturnUrlパラメーターに格納するため、メソッドをオーバーライドすることでこのバグを回避しましたGetReturnUrlFromResponse

/// <summary>
/// Provides a workaround for a bug in the standard authentication module.
/// </summary>
/// <remarks>
/// This class corrects WIF error ID3206 "A SignInResponse message may only
/// redirect within the current web application..."
/// WSFAM produces the error when the ReturnUrl is the root of the web application,
/// but doesn't have a trailing slash. For instance, "/app" is considered incorrect
/// by WSFAM whereas "/app/" is correct.
/// </remarks>
public class FixedWsFederationAuthenticationModule : System.IdentityModel.Services.WSFederationAuthenticationModule
{
    /// <summary>
    /// Extracts the URL of the page that was originally requested from
    /// the sign-in response.
    /// </summary>
    /// <returns>
    /// The URL of the page that was originally requested by the client.
    /// This is the URL (at the relying party) to which the client should
    /// be redirected following successful sign-in.
    /// </returns>
    /// <param name="request">
    /// The HTTP request that contains a form POST, which contains the
    /// WS-Federation sign-in response message.
    /// </param>
    protected override string GetReturnUrlFromResponse(HttpRequestBase request)
    {
        string returnUrl = base.GetReturnUrlFromResponse(request);

        // First Check if the request url doesn't end with a "/"
        if (!string.IsNullOrEmpty(returnUrl) && !returnUrl.EndsWith("/"))
        {
            // Compare if (return Url +"/") is equal to the Realm path,
            // so only root access is corrected.
            // /AppName plus "/" is equal to /AppName/
            // This is to avoid MVC urls.
            if (string.Compare(
                returnUrl + "/",
                new Uri(Realm).LocalPath,
                StringComparison.InvariantCultureIgnoreCase) == 0)
            {
                // Add the trailing slash.
                returnUrl += "/";
            }
        }

        return returnUrl;
    }
}

このクラスを利用するには、web.config に登録する必要があります。この要素をセクションに追加しsystem.webServer/modules、適切な部分を変更します。

<add name="WSFederationAuthenticationModule" type="YOUR_NAMESPACE.FixedWsFederationAuthenticationModule, YOUR_ASSEMBLY" preCondition="managedHandler" />
于 2013-03-07T19:26:00.707 に答える
2

デフォルトで動的ポートの仮想サーバーで実行されるWebアプリケーションにSTS参照を追加したときに、この問題が発生しました。IIS から実行するように変更し (仮想 Web サーバーと同様に、IIS/IIS Express から実行しない限り STS へのリダイレクトは行われません)、web.config で手動で編集して、Microsoft.IdentityModel 構成の対象ユーザー URI を変更しました。

FederationMetadata.xml を見ると、まだ古い場所 (動的ポートを使用) を参照していました。STS 参照を再度追加して更新したところ、機能しました。

于 2012-10-05T05:41:34.927 に答える