2012-11-08 15 views
11

Wir haben Windows Identity Foundation (WIF) in unserem ASP.NET 4.5 MVC 4-Projekt mit Hilfe der Identity und Access ... Erweiterung erfolgreich konfiguriert für Visual Studio 2012. Sie können jedoch einen bestimmten Pfad nicht von der Autorisierung ausschließen, um anonymen Zugriff zuzulassen.Ausschließen von WIF-Autorisierung in einem ASP.NET MVC 4-Projekt

Wenn wir auf unsere Standardroute (d. H. /Home) zugreifen, leitet die passive Umleitung uns zum konfigurierten Aussteller Uri um. Dies ist aktuell. Aber jetzt nehmen wir an, wir möchten den Pfad /Guest von der STS-Authentifizierung ausschließen, so dass jeder auf http://ourhost/Guest zugreifen kann, ohne an den STS-Aussteller weitergeleitet zu werden. Dort befinden sich nur statische Dokumente.

Snippets von Web.config:

<system.identityModel> 
    <identityConfiguration> 
    <audienceUris> 
     <add value="http://ourhost/" /> 
    </audienceUris> 
    <issuerNameRegistry type="System.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
     <trustedIssuers> 
     <add thumbprint="9B74****40D0" name="OurSTS" /> 
     </trustedIssuers> 
    </issuerNameRegistry> 
    <certificateValidation certificateValidationMode="None" /> 
    </identityConfiguration> 
</system.identityModel> 
<system.identityModel.services> 
    <federationConfiguration> 
    <cookieHandler requireSsl="false" /> 
    <wsFederation passiveRedirectEnabled="true" issuer="http://oursts/Issue" realm="http://ourhost/" reply="http://ourhost/" requireHttps="false" /> 
    </federationConfiguration> 
</system.identityModel.services> 

Weiterhin haben wir ...

<system.webServer> 
    <!-- ... --> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" /> 
    <add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" /> 
    <remove name="FormsAuthentication" /> 
    </modules> 
</system.webServer> 

und schließlich:

<system.web> 
    <!-- ... --> 
    <authentication mode="None" /> 
</system.web> 

Wir haben versucht, die folgenden ohne Erfolg:

<location path="~/Guest"> <!-- also "/Guest" is not working --> 
    <system.web> 
    <authorization> 
     <allow users="*" /> 
    </authorization> 
    </system.web> 
</location> 

Wir haben auch versucht, eine kleine Datei Web.config in diesen Ordner zu legen, ohne Erfolg. Egal, in welchem ​​Uri wir im Browser suchen, wir werden immer umgeleitet.

Was ist der richtige Weg, dies zu erreichen?

EDIT

der vorherigen entfernt „akzeptiert beantwortet“, setzen Sie „akzeptierte Antwort“ auf Eugenios answer, da dies die weitere sachdienliche Antwort ist.

Antwort

11

In einer MVC-Anwendung definieren Sie den Zugriff normalerweise über das Attribut [Authorize] in Controllern und Aktionen.

Entfernen Sie einfach von web.config:

<system.web> 
    <authorization> 
     <deny users="?" /> 
     </authorization> 

Hinweis: dies in der Regel automatisch von den hinzugefügt wird "Add STS Reference" Assistenten in VS2010

Es scheint, dass das Verhalten genau die gleichen auf VS2012 und die neuen Tools. Ich habe gerade eine brandneue MVC4-App erstellt. Hat das "Identity and Access ..." Tool mit einer lokalen Config STS (alle Standardwerte beibehalten) ausgeführt.

Es hat dieses Fragment in die web.config hinzufügen:

<authorization> 
    <deny users="?" /> 
</authorization> 

ich es entfernt und hinzugefügt [Authorize] zum Über-Controller Aktion:

[Authorize] 
public ActionResult About() 
{ 
    ViewBag.Message = "Your app description page."; 

    return View(); 
} 

Wenn ich auf den Link "Info" klicken , dann werde ich auf die STS umgeleitet. Alles andere funktioniert mit anonymem Zugriff.

Hinweis:

Sie haben eine gewisse Kontrolle über diese auch im Assistenten (siehe „Konfiguration“ Seite des Assistenten).

+0

Dank Eugenio, verwenden wir Visual Studio 2012 und "Add STS Reference" wird nicht dort verfügbar, müssen Sie die "Identität und Ac cess ... "Werkzeug stattdessen. Ich denke, ich bin nah an der Lösung, sieht aus wie die 'passivRedirectEnabled =" true "' hat mich auf die STS unabhängig von Attributverwendung umgeleitet.Die Einstellung auf "false" und das Umleiten mithilfe einiger Umleitungshilfen in einem benutzerdefinierten Authentifizierungsattribut scheint im Moment ziemlich gut zu sein. Ich werde meine Lösung posten, wenn ich fertig bin, Danke! – thmshd

+0

Ich verstehe. Es sollte auch mit passivRedirectEnabled = true funktionieren. Ich überprüfe auch mein System. –

+0

Da ich wirklich Probleme hatte, dies mit der passivRedirectEnabled Option zu erreichen, möchte ich meine eigene Antwort als Lösung akzeptieren, aber ich schätze Ihre Hilfe zu diesem Thema sehr und glaube, dass es wahrscheinlich auch funktioniert, aber vielleicht liegt die Lösung irgendwo darin verborgen Meine 'web.config' Einstellungen in Kombination mit dem IIS Setup. Danke für deine Zeit, wirklich geschätzt! – thmshd

2

Was mich schließlich in die richtige Richtung war ein älteres blog post, das erklärt, wie eine bestimmte Steuerung oder Bereich der Seite zu schützen. In Kombination mit globalen Filtern bin ich fast da.

Es scheint, als ob der Schlüssel nicht die Option passiveRedirectEnabled="true" verwenden soll, sondern auf false. Nur dann haben Sie die volle Kontrolle über den Authentifizierungsprozess, müssten aber die passive Weiterleitung selbst auslösen, indem Sie die Klasse SignInRequestMessage verwenden (was keine große Sache ist).

Bessere Lösungen mit weniger Code erforderlich sind willkommen.

EDIT

entfernt „akzeptiert beantwortet“ Zustand für diese, stellen Sie „akzeptierte Antwort“ auf Eugenios anwer, da dies die weitere sachdienliche Antwort ist.

2

Ich war in der gleichen Situation wie Thomas. In meinem Fall habe ich IISExpress lokal getestet/verwendet.

Eugenios Antwort brachte mich fast zum arbeiten, mit einer zusätzlichen Anforderung. Ich musste die "Anonyme Authentifizierung" in meiner MVC-Projekteigenschaft auf "Aktiviert" setzen.

Dies wurde entweder standardmäßig deaktiviert oder möglicherweise so festgelegt, wenn die VS 2012-Tools "Identity and Access ..." verwendet wurden.

Also, zur Erinnerung, es gab keinen Code oder spezielle Attribute zu schreiben/zu pflegen.

Meine csproj Datei enthält:

<IISExpressAnonymousAuthentication>enabled</IISExpressAnonymousAuthentication> 

Meine web.config enthält:

<system.web> 
    <authentication mode="None" /> 
</system.web> 

<system.web> 
    <authorization> 
     <allow users="*" /> 
    </authorization> 
</system.web> 

<system.webServer> 
    <modules> 
     <remove name="FormsAuthentication" /> 
     <add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" /> 
     <add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" /> 
    </modules> 
</system.webServer> 

<system.identityModel.services> 
    <federationConfiguration> 
     <wsFederation passiveRedirectEnabled="true" issuer="https://REMOVED.accesscontrol.windows.net/v2/wsfederation" realm="urn:REMOVED" requireHttps="false" /> 
    </federationConfiguration> 
</system.identityModel.services> 

Und ich fügen Sie den Standard [autorisieren] Attribut Aktionen an die Steuerung, die ich will von WIF verteidigt werden :

[Authorize] 
public ActionResult About() 
{ 
.... 
} 
4

kann ich [Authorize] nicht zu arbeiten - es nicht zu tun, die Umleitung zu meiner STS, und ich bin mir sicher, dass ich etwas vermisse. Ich habe jedoch herausgefunden, wie ich das Problem lösen kann.

In global.asax:

protected void Application_Start() 
    { 
     ... config stuff ... 
     FederatedAuthentication.WSFederationAuthenticationModule.AuthorizationFailed += WSFederationAuthenticationModule_AuthorizationFailed; 
    } 

und dann:

void WSFederationAuthenticationModule_AuthorizationFailed(object sender, AuthorizationFailedEventArgs e) 
    { 
     // Do path/file detection here 
     if (Request.Path.Contains("/Content/") || Request.Path.Contains("/Scripts/")) 
     { 
      e.RedirectToIdentityProvider = false; 
     } 
    } 
+1

Danke, Andrew, ich möchte jedoch darauf hinweisen, dass dieser Ansatz eine Sicherheitslücke schafft, weil ich jetzt auf den Controller und die Aktion zugreifen kann, die ich möchte, weil ich am Ende der URL so etwas hinzufügen kann: "#/Content/"und das wird das anfängliche Routing nicht ändern, aber es wird mir Zugriff auf den Controller geben. –

+0

Dies funktionierte nicht für mich, während die angenommene Antwort ohne zusätzliche Änderungen funktionierte. Ich bekam immer noch die Antwort. – itslittlejohn