2012-11-08 4 views
11

Abbiamo configurato correttamente Windows Identity Foundation (WIF) nel nostro progetto ASP.NET 4.5 MVC 4 con l'aiuto dell'estensione Identità e accesso ... per Visual Studio 2012. Tuttavia, non è possibile escludere un percorso specifico dall'autorizzazione per consentire l'accesso anonimo.Escludere il percorso specifico dall'autorizzazione WIF in un progetto ASP.NET MVC 4

Quando accediamo al nostro percorso predefinito (ad esempio /Home), il reindirizzamento passivo ci reindirizzerà all'emittente Uri configurato. Questo è currect. Ma ora supponiamo di voler escludere il percorso /Guest dall'autenticazione STS in modo che tutti possano accedere a http://ourhost/Guest senza essere indirizzati all'emittente STS. Solo i documenti statici si trovano lì.

Frammenti da 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> 

Inoltre abbiamo ...

<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> 

e infine:

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

Abbiamo provato la seguente senza successo:

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

Abbiamo anche provato a mettere un piccolo file Web.config in questa cartella, senza successo. Non importa quale Uri individuiamo nel browser, siamo sempre reindirizzati.

Qual è il modo corretto per realizzare questo?

EDIT

Rimosso il precedente "accettato risposto", impostare "risposta accettata" per Eugenios answer come questo è la risposta più utile.

risposta

11

In un'applicazione MVC si definisce in genere l'accesso tramite l'attributo [Authorize] in controller e azioni.

Basta togliere dal web.config:

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

Nota: questo di solito è aggiunto automaticamente dal "Aggiungi STS riferimento" mago in VS2010

Sembra che il comportamento è esattamente lo stesso su VS2012 e i nuovi strumenti. Ho appena creato una nuovissima app MVC4. Ha eseguito lo strumento "Identità e accesso ..." con una configurazione locale STS (ha lasciato tutti i valori predefiniti).

Lo ha fatto aggiungere questo frammento al web.config:

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

ho rimosso e aggiunto [Authorize] al proposito di azione del controller:

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

    return View(); 
} 

Quando clicco sul link "Informazioni su" , quindi vengo reindirizzato al STS. Tutto il resto funziona con l'accesso anonimo.

Nota:

avete un po 'di controllo anche su questo nella procedura guidata (vedere la pagina "Configurazione" della procedura guidata).

+0

Grazie Eugenio, si utilizza Visual Studio 2012 e "Aggiungi STS riferimento" non è disponibile lì, devi usare "Identity and Ac cess ... "invece lo strumento. Penso di essere vicino alla soluzione, sembra il 'passiveRedirectEnabled =" true "' mi stava reindirizzando al STS indipendentemente dall'uso di qualsiasi attributo.L'impostazione su 'false' e ​​il reindirizzamento usando alcuni helper di reindirizzamento all'interno di un attributo di autenticazione personalizzato sembra piuttosto buono al momento. Pubblicherò la mia soluzione quando ho finito, grazie! – thmshd

+0

Vedo. Dovrebbe funzionare anche con passiveRedirectEnabled = true. Controllerò anche il mio sistema. –

+0

dal momento che ho davvero avuto problemi con l'opzione passiveRedirectEnabled abilitata, voglio accettare la mia risposta come soluzione, ma apprezzo molto il tuo aiuto su questo argomento e credo che probabilmente funzioni anche, ma forse la soluzione risiede da qualche parte sepolta all'interno le mie impostazioni 'web.config' in combinazione con l'installazione di IIS. Grazie per il tuo tempo, davvero apprezzato! – thmshd

2

Ciò che alla fine mi ha indirizzato nella giusta direzione era un vecchio blog post che spiega come proteggere un controller specifico o un'area della pagina. In combinazione con i filtri globali sono quasi arrivato.

Sembra che la chiave non sia quella di utilizzare l'opzione passiveRedirectEnabled="true" ma impostarla su false. Solo allora hai il pieno controllo del processo di autenticazione, ma dovresti attivare il reindirizzamento passivo da te, usando la classe SignInRequestMessage (che non è un grosso problema).

Soluzioni migliori con meno codice richiesto sono i benvenuti.

EDIT

Rimosso "accettato risposto" stato per questo, impostare "risposta accettata" per Eugenios anwer come questo è la risposta più utile.

2

Ero nella stessa situazione di Thomas. Nel mio caso, stavo testando/usando IISExpress localmente.

La risposta di Eugenio mi ha quasi fatto funzionare, con un requisito aggiuntivo. Ho dovuto impostare "Autenticazione anonima" nella mia proprietà del progetto MVC su "Abilitato".

Questo è stato disabilitato per impostazione predefinita o eventualmente impostato in questo modo quando si utilizza VS 2012 "Identità e accesso ...".

Quindi, per ricapitolare, non c'era alcun codice o attributi speciali da scrivere/mantenere.

Il mio file csproj contiene:

<IISExpressAnonymousAuthentication>enabled</IISExpressAnonymousAuthentication> 

mio web.config contiene:

<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> 

E, aggiungo lo standard [Autorizza] attribuire al controllore azioni che voglio essere difeso da WIF :

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

non posso ottenere [Authorize] al lavoro - non sta facendo il reindirizzamento al mio STS, e sono sicuro che è qualcosa che mi manca. Ho però scoperto come risolvere per la domanda originale.

In global.asax:

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

e poi:

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

Grazie, Andrew, vorrei comunque sottolineare che questo approccio crea un buco di sicurezza, perché ora posso accedere a qualsiasi controller e azione che voglio, perché posso aggiungere qualcosa di simile alla fine dell'URL: "#/Content/"e questo non cambierà il routing iniziale, ma mi consentirà di accedere al controller. –

+0

Questo non ha funzionato per me, mentre la risposta accettata ha funzionato senza ulteriori modifiche. Stavo ancora ricevendo la risposta 401. – itslittlejohn