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>
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
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:
fonctionnera, alors que
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.
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);
}
}
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.
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" />
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é.