2013-02-26 7 views
14

Ho un'applicazione Web MVC4 che utilizza l'autenticazione di Windows, cioè nel web.config ho
<authentication mode="Windows" /> e che funziona bene e tutto è ok.Usa autenticazione anonima in MVC4 sul singolo controllore quando l'intera applicazione utilizza di Windows Authenticaion

Tuttavia ora ho bisogno di un controller (un controller Web API in effetti) a cui si deve accedere in modo anonimo da un componente di terze parti. Il problema è che ogni volta che voglio richiamare questo metodo richiede le credenziali dell'utente.

Ho provato a mettere l'attributo AllowAnonymous al controller e ai metodi ma non ha avuto esito positivo.

[AllowAnonymous] public bool Get(string Called, string Calling, string CallID, int direction)

ho controllato su entrambi IIS Express e IIS 8 con l'autenticazione anonima e l'autenticazione di Windows attivata.

Sembra che l'autenticazione di Windows preceda qualsiasi altra autenticazione e non possa essere ignorata.

C'è un modo per realizzare questo?

risposta

14

Aggiungi questo al tuo Web.config. Qui, il mio controller è denominato "WebhookController".

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

See this KB article for more info.

Modifica - Come Erik menzionato qui di seguito, in applicazioni MVC non si dovrebbe usare web.config <authorization> tag per la sicurezza. Utilizzare invece gli attributi [Authorize]. Ciò consentirà agli attributi [AllowAnonymous] di funzionare correttamente. You can read more about this here.

+0

Non credo che questo lavoro per me. Questa impostazione è sovrascritta da '' e il sito Web richiede ancora il nome utente e la password per poter accedere. A parte questo, sto utilizzando MVC e tali impostazioni di configurazione in web.config potrebbero non essere sempre d'aiuto a causa del routing. –

+0

Funziona per me. Sto anche usando '' con MVC3. Tuttavia non ho impostato alcuna regola di routing speciale. Potrebbe essere necessario fare confusione con il percorso della posizione. –

+0

Dandogli un secondo tentativo: funziona. Sembra che l'attributo 'AllowAnonymous' non sia sufficiente con l'autenticazione di Windows e il tag 'location' è quello che funziona meglio. Grazie per avermi indicato quale potrebbe essere la soluzione giusta per il problema! –

3

La risposta accettata sembra non essere aggiornati, in modo da ...

Nel web.config, rimuovere queste linee:

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

In Esplora soluzioni, scegliere il progetto, quindi fare clic su f4 (o aprire l'esploratore delle proprietà). Abilita autenticazione anonima.

Ora sei libero di utilizzare gli attributi Authorize e AllowAnonymous. Sono piuttosto semplici, Authorize significa che l'utente deve essere autorizzato per accedere all'azione o al controller, AllowAnonymous significa il contrario. Se un utente non autorizzato tenta di accedere a un controller o un'azione con l'attributo Authorize, verrà reindirizzato a una pagina di accesso. Se si inserisce Authorize su un controller, esso si applica a tutte le azioni del controller, tranne quelle con AllowAnonymous.

0

web.config non deve essere toccato come indicato here.

Per ottenere il risultato desiderato, è necessario utilizzare AllowAnonymous e [Authorize] (e, eventualmente, alcuni attributi di autorizzazione personalizzati, se necessario).

passaggi da eseguire:

  1. Assicurarsi che IIS ha sia autenticazione anonima e autenticazione Windows configurato per il sito web application/web

  2. Tutti i regolatori devono usare l'attributo [Authorize]. Questo può essere facilmente ottenuto se tutti ereditano da una classe di controller comune (ad es. BaseController/BaseApiController). Es .:

    [Authorize] 
    public class BaseController : System.Web.Mvc.Controller 
    { 
    
    } 
    
    
    [Authorize] 
    public class BaseApiController : System.Web.Http.ApiController 
    { 
    
    } 
    
  3. Aggiungi [AllowAnonymous] attributo a tutte le azioni che dovrebbero essere anonimi. Es .:

    [RoutePrefix("Api/Anonymous")] 
    [Authorize] 
    public class AnonymousController : ApiController 
    { 
        [HttpGet] 
        [Route("GetServiceStatus")] 
        [AllowAnonymous] 
        public string GetServiceStatus() 
        { 
         return "OK"; 
        } 
    } 
    
Problemi correlati