web-dev-qa-db-fra.com

Erreur - Un message SignInResponse peut uniquement rediriger au sein de l'application Web actuelle - Application MVC 2.0

J'ai une situation où nous avons une application MVC 2 (j'ai essayé cela avec une application MVC 2 de base sans aucun truc supplémentaire, toujours le même problème) et j'utilise adfs 2 pour authentifier mes utilisateurs.

Alors .. Maintenant, j'entre dans mon application et j'obtiens ce qui suit .. ID3206: Un message SignInResponse ne peut que rediriger dans l'application Web actuelle: '/ [app]' est non autorisé. Description: une exception non gérée s'est produite lors de l'exécution de la demande Web en cours. Veuillez consulter la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code. Détails de l'exception: Microsoft.IdentityModel.Protocols.FederationException: ID3206: Un message SignInResponse ne peut être redirigé que dans l'application Web actuelle: '/ [app]' n'est pas autorisé.

J'ai lu la plupart des blogs à ce sujet et en ai posté un.

    <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. J'ai la barre oblique de fin sur le royaume et le public Uris.
  2. J'ai ajouté ce qu'il a suggéré à Application_BeginRequest - J'ai ensuite copié le code dans [domaine de développement] car c'est là que se trouvent les certificats. Il se bloque alors dans une boucle infinie.
  3. J'ai également vérifié ma partie de confiance sur le serveur de Genève. Les identifiants et points de terminaison (POST) sont tous les deux https: // [domaine de développement]/[app]/- à nouveau avec la barre oblique de fin

Je pense que c'est un problème avec le fait qu'il s'agit d'une application MVC, j'ai créé de nombreux sites Web Claims Aware et mes réclamations, etc. sur la page default.aspx. Ma pensée est que le routage impliqué dans l'application MVC le rend en quelque sorte faux?

toute aide vraiment appréciée car je regarde cela pendant un moment maintenant sans résultat.

J

36
John

J'ai arraché mes cheveux sur celui-ci. J'ai aussi la barre oblique de fin spécifiée dans ma configuration. Il s'avère que, dans mon cas, la navigation vers mon application avec une barre oblique de fin dans le navigateur comme suit:

http: // localhost/myapp /

fonctionnera, alors que

http: // localhost/myapp

ne fera pas.

Si je peux trouver plus de raisons pour lesquelles c'est le cas, j'ajouterai un peu plus de détails sur pourquoi cela se produit.

35
Dave Markle

Je remplace le RedirectToIdentityProvider sur la sous-classe de WSFederationAuthenticationModule. Cela ne se produit qu'une seule fois avant de rediriger vers le STS. Vous devez dire au fichier de configuration d'utiliser cette classe FixedWSFederationAuthenticationModule au lieu du defualt 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);
    }
}
18
user1496129

Ce code s'occupe de cela (mettez-le dans 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 + "/");
}

ÉDITER:

Une autre chose à vérifier est l'élément federationAuthentication/wsFederation dans votre Microsoft.identityModel dans Web.config. Vérifiez que l'émetteur et le domaine sont corrects.

10
Mike Cheel

J'utilise l'authentification par formulaire avec WIF. Le module d'authentification par formulaires redirige les demandes non autorisées vers le contrôleur approprié et stocke l'URL initialement demandée dans le paramètre ReturnUrl, j'ai donc contourné ce bogue en remplaçant la méthode 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;
    }
}

Pour utiliser cette classe, vous devez l'enregistrer dans le web.config. Ajoutez cet élément au system.webServer/modules section, modification des parties appropriées:

<add name="WSFederationAuthenticationModule" type="YOUR_NAMESPACE.FixedWsFederationAuthenticationModule, YOUR_Assembly" preCondition="managedHandler" />
5
Gebb

J'ai eu ce problème lorsque j'ai ajouté une référence STS à mon application Web qui, par défaut, s'exécute sous un serveur virtuel sur un port dynamique. Je l'ai changé pour l'exécuter à partir de IIS (comme avec le serveur Web virtuel, la redirection vers STS ne se produira que si vous l'exécutez à partir de IIS/IIS Express ) et modifié manuellement par web.config pour modifier les URI d'audience sous la configuration Microsoft.IdentityModel.

Lorsque j'ai regardé le fichier FederationMetadata.xml, il faisait toujours référence à l'ancien emplacement (avec port dynamique). J'ai actualisé ma référence STS en l'ajoutant à nouveau et cela a fonctionné.

2
Badal