c# asp.net-mvc federated-identity adfs2.0 sts-securitytokenservice

c# - Error-Un mensaje SignInResponse solo puede redirigirse dentro de la aplicación web actual-Aplicación MVC 2.0



asp.net-mvc federated-identity (5)

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 + "/"); }

EDITAR:

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

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, igual problema) y estoy usando adfs 2 para autenticar a mis usuarios.

Entonces ... Ahora entro en mi aplicación y obtengo el siguiente ... ID3206: Un mensaje de SignInResponse solo puede redirigirse dentro de la aplicación web actual: ''/ [app]'' 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 sobre esto, y publicado en 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. Tengo el rayo final en el reino y el público.
  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 revisé mi fiesta de confianza en el servidor de Ginebra. Los identificadores y puntos finales (POST) son tanto https: // [dominio de desarrollo] / [app] / - 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?

cualquier ayuda realmente apreciada, ya que estoy mirando esto por un momento, sin éxito ...

J


Estoy usando autenticación de formularios con WIF. El módulo auth de formularios redirige las solicitudes no autorizadas al controlador correcto y almacena la URL solicitada originalmente en el parámetro ReturnUrl , así que ReturnUrl este error anulando 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, debe registrarla en el web.config. Agregue este elemento a la sección system.webServer/modules , cambiando las partes apropiadas:

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


Me he estado rasgando los pelos en este. 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 inclinada en el navegador como esta:

http://localhost/myapp/

funcionará, mientras que

http://localhost/myapp

no lo hará

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


Tuve este problema cuando agregué la 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ó.


WSFederationAuthenticationModule el RedirectToIdentityProvider en la subclase de WSFederationAuthenticationModule . Esto sucede solo una vez antes de redireccionar al STS. Tiene que indicarle al archivo de configuración que use esta clase FixedWSFederationAuthenticationModule lugar de la 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); } }