35

Tengo una situación en la que tenemos una aplicación MVC 2 (Probé esto con una aplicación MVC 2 básica sin ningún material adicional, el mismo problema) y estoy usando adfs 2 para autenticar a mis usuarios.Error - Un mensaje SignInResponse solo puede redirigirse dentro de la aplicación web actual - Aplicación MVC 2.0

Así que .. Ahora me meto en mi solicitud y me sale el siguiente .. ID3206: Un mensaje SignInResponse sólo se puede redirigir dentro de la aplicación web actual: '/ [aplicación]' no está permitido. Descripción: Se produjo una excepción no controlada durante la ejecución de la solicitud web actual. Revise el seguimiento de la pila para obtener más información sobre el error y dónde se originó en el código. Detalles de la excepción: Microsoft.IdentityModel.Protocols.FederationException: ID3206: un mensaje SignInResponse solo puede redirigirse dentro de la aplicación web actual: '/ [app]' no está permitido.

He leído la mayoría de los blogs en esto, y publicado a uno ..

<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. que tienen la barra final en el reino y audienceUris.
  2. He agregado lo que sugirió a Application_BeginRequest - Luego copié el código a [dominio de desarrollo] ya que es donde están los certs. Simplemente se queda atascado en un bucle infinito.
  3. También he comprobado mi parte que confía en el servidor de Ginebra .. Los identificadores y puntos finales (POST) son ambos https: // [dominio desarrollo]/[aplicación]/- de nuevo con la barra final

Creo que es un problema con el hecho de que es una aplicación de MVC, he creado numerosos sitios web de Claims Aware y obtuve mis afirmaciones, etc. en la página default.aspx. ¿Mi opinión es que la ruta que está involucrada con la aplicación MVC de alguna manera está volviendo a publicarla mal?

ninguna ayuda realmente apprecaited como Im mirar esto por un tiempo tranquilo en vano ..

J

+1

que tienen el mismo problema con MVC4. – SGarratt

Respuesta

34

he estado rompiendo mi pelo fuera de éste. Yo también tengo la barra final especificada en mi configuración. Resulta que, en mi caso, navegando a mi aplicación con una barra final en el navegador, así:

http://localhost/myapp/

va a funcionar, mientras que

http://localhost/myapp

no lo hará.

Si puedo encontrar más razones sobre por qué este es el caso, agregaré más información sobre por qué sucede esto.

+1

+1 - Esto me salvó de un poco de frustración :) – VoodooChild

+0

gracias, esto me salvó el día – Rahul

2

Tuve este problema cuando agregué referencia STS a mi aplicación web que se ejecuta de forma predeterminada en el servidor virtual en el puerto dinámico. Lo cambié para ejecutarlo fuera de IIS (como con el servidor web virtual, la redirección a STS no ocurrirá a menos que lo ejecute fuera de IIS/IIS Express) y manualmente editado por web.config para cambiar los URI de audiencia en la configuración de Microsoft.IdentityModel.

Cuando miré FederationMetadata.xml, todavía se estaba refiriendo a la ubicación anterior (con puerto dinámico).Actualicé mi Referencia STS añadiéndola nuevamente y funcionó.

10

Este código se encarga de eso (ponerlo en 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 + "/"); 
} 

EDIT:

Otra cosa a comprobar es el elemento/wsFederation federationAuthentication en su microsoft.identityModel en Web. config. Verifique que el emisor y el reino sean correctos.

+1

Con este enfoque terminé con algunas extrañas redirecciones interminables entre el IP-STS y RP en SignIn – Vladislav

+0

Creo que algo más está sucediendo entonces pero no podría decirte qué. –

+0

Esto funcionó para nosotros y fue el más fácil de implementar. Nuestra situación es que tenemos varias aplicaciones virtuales en un sitio web, por lo que cada una de ellas es una página de inicio de sesión dentro de su propia "carpeta" y lo anterior solucionó el problema. –

16

puedo reemplazar el RedirectToIdentityProvider en la subclase de WSFederationAuthenticationModule. Esto sucede solo una vez antes de redireccionar al STS. Usted tiene que decirle al archivo de configuración para utilizar esta clase FixedWSFederationAuthenticationModule en lugar de la 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); 
    } 
} 
+1

Esto me lo arregló en mi aplicación MVC4, gracias. – SGarratt

+4

Aquí se muestra la sintaxis para su web.config: ADH

+0

¿Hay alguna razón a la subclase en lugar de poner 'WSFederationAuthenticationModule_RedirectingToIdentityProvider'? 'RedirectingToIdentityProviderEventArgs' te permite mutar el' SignInRequestMessage' por lo que yo sé. –

5

estoy usando la autenticación de formularios con WIF. El módulo de formas de autenticación redirige las peticiones no autorizadas al controlador correcto y almacena la dirección URL solicitada originalmente en el parámetro ReturnUrl, así que trabajó evitar este error reemplazando el método 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; 
    } 
} 

Para hacer uso de esta clase, es necesario registrarlo en el web.config. Añadir este elemento a la sección system.webServer/modules, cambiando las partes apropiadas:

<add name="WSFederationAuthenticationModule" type="YOUR_NAMESPACE.FixedWsFederationAuthenticationModule, YOUR_ASSEMBLY" preCondition="managedHandler" /> 
Cuestiones relacionadas