35

Mam sytuację, w której mamy aplikację MVC 2 (próbowałem tego z podstawową aplikacją MVC 2 bez żadnych dodatkowych rzeczy, wciąż ten sam problem) i używam adfs 2 do uwierzytelniania moich użytkowników.Błąd - Wiadomość SignInResponse może przekierowywać tylko w bieżącej aplikacji internetowej - aplikacja MVC 2.0

Więc .. Teraz dostać się do mojego wniosku i mam poniżej .. ID3206: Komunikat SignInResponse może przekierować tylko w bieżącej aplikacji internetowej: „/ [aplikacja]” jest niedozwolone. Opis: Wystąpił nieobsługiwany wyjątek podczas wykonywania bieżącego żądania WWW. Sprawdź ślad stosu, aby uzyskać więcej informacji o błędzie i skąd pochodzi w kodzie. Szczegóły wyjątku: Microsoft.IdentityModel.Protocols.FederationException: ID3206: Wiadomość SignInResponse może przekierowywać tylko w bieżącej aplikacji internetowej: "/ [aplikacja]" jest niedozwolone.

Znam większość blogów na ten temat, i pisał do jednego ..

<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. mam ukośnik na sferę i audienceUris.
  2. Dodałem to, co zaproponował aplikacji Application_BeginRequest - następnie skopiowałem kod do [domeny rozwojowej], ponieważ tam są certyfikaty. Po prostu utknie w nieskończonej pętli.
  3. ja również sprawdziłem Strona ufająca na serwerze Genewie .. Identyfikatory i punkty końcowe (PO) są https: // [domena rozwój]/[aplikacja]/- dzięki tylnym slash

Myślę, że jest to problem związany z tym, że jest to aplikacja MVC. Stworzyłem wiele stron z informacjami o roszczeniach i otrzymałem moje roszczenia itp. Na stronie default.aspx. Uważam, że routing, który jest związany z aplikacją MVC, w jakiś sposób umieszcza ją z powrotem w błędzie?

każda pomoc naprawdę apprecaited jak Im patrząc na to za jakiś czas spokojnej teraz bezskutecznie ..

J

+1

Mam ten sam problem z MVC4. – SGarratt

Odpowiedz

34

Byłem łzawienie włosy się na ten jeden. Ja też mam końcowe ukośniki określone w mojej konfiguracji. Okazuje się, że w moim przypadku, przechodząc do mojego app z ukośnika w przeglądarce tak:

http://localhost/myapp/

zadziała, natomiast

http://localhost/myapp

nie będzie.

Jeśli uda mi się znaleźć więcej powodów, dlaczego tak się dzieje, dodam trochę więcej informacji na temat tego, dlaczego tak się dzieje.

+1

+1 - To uratuje mnie od pewnej frustracji :) – VoodooChild

+0

dziękuję, to uratowało mój dzień – Rahul

2

Miałem ten problem, gdy dodałem odwołanie STS do mojej aplikacji internetowej, która domyślnie działa pod wirtualnym serwerem na porcie dynamicznym. Zmieniłem go, aby uruchomić go z IIS (jak w przypadku wirtualnego serwera WWW, przekierowanie do STS nie nastąpi, chyba że uruchomisz go z IIS/IIS Express) i ręcznie edytowane przez web.config, aby zmienić identyfikatory URI odbiorców w konfiguracji Microsoft.IdentityModel.

Kiedy patrzyłem na plik FederationMetadata.xml, wciąż odnosiłem się do starej lokalizacji (z portem dynamicznym).Odświeżyłem mój STS Reference, dodając go ponownie i zadziałało.

10

Kod ten dba o to (mówiąc w 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:

Kolejną rzeczą do sprawdzenia jest elementem/wsFederation federationAuthentication w microsoft.identityModel w sieci. config. Sprawdź, czy wydawca i dziedzina są prawidłowe.

+1

Dzięki temu podejściu zakończyłem z dziwnymi niekończącymi się przekierowaniami między IP-STS i RP na SignIn – Vladislav

+0

Myślę, że dzieje się coś innego ale nie mogłem ci powiedzieć co. –

+0

To działało dla nas i było najłatwiejsze do wdrożenia. Nasza sytuacja polegała na tym, że mamy kilka wirtualnych aplikacji w obrębie jednej strony internetowej, więc każda z nich jako strona logowania w swoim "folderze" i wyżej rozwiązała problem. –

16

Zastępuję RedirectToIdentityProvider w podklasie WSFederationAuthenticationModule. Dzieje się tak tylko raz przed przekierowaniem do STS. Trzeba powiedzieć, że plik konfiguracyjny, aby użyć tej klasy FixedWSFederationAuthenticationModule zamiast 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

Naprawiłem to dla mnie w mojej aplikacji MVC4, dzięki. – SGarratt

+4

Oto składnia dla web.config: ADH

+0

Czy jest jakiś powód do podklasy zamiast umieszczać 'WSFederationAuthenticationModule_RedirectingToIdentityProvider'? 'RedirectingToIdentityProviderEventArgs' pozwala zmutować' SignInRequestMessage', o ile wiem. –

5

Używam uwierzytelniania formularzy z WIF. Moduł auth formularzy przekierowuje nieautoryzowane żądania do właściwego kontrolera i zapisuje pierwotnie żądany adres URL w parametrze ReturnUrl, więc obejrzałem ten błąd przez przesłonięcie metody 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; 
    } 
} 

Aby skorzystać z tej klasy, należy zarejestrować ją w pliku web.config. Dodaj ten element do sekcji system.webServer/modules, zmieniając odpowiednie części:

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