2009-08-14 15 views
7

Sto lavorando per aggiungere l'autorizzazione a un'applicazione ASP.NET MVC ed eseguire un blocco stradale. Sono finalmente riuscito a ottenere il nostro provider di appartenenza personalizzato cablato e ottenere l'autenticazione di lavoro per l'app. Ora, come previsto, se aggiungo l'attributo [Autorizza] ai miei controller, l'utente deve essere autenticato per visualizzare la pagina. Ho anche testato con successo [Authorize (Users = "{userName}")] che funziona anche per limitare la pagina a quell'utente specifico.HttpContext.Current.User.IsInRole (roleName) restituisce sempre false

Il problema è che [Authorize (Roles = "{RoleName}")] non sembra funzionare come mi aspetto. Se aggiungo quell'attributo a un controller, ogni volta che provo ad accedere alla pagina corrispondente, vengo reindirizzato alla nostra pagina di accesso. Questo è quello che mi aspetterei che succedesse se l'utente non ha il ruolo richiesto, ma sta accadendo anche se l'utente ha quel ruolo. Ho controllato sia User.IsInRole ("{roleName}") che HttpContext.Current.User.IsInRole ("{roleName}") in un metodo View, a Controller e a Helper e restituisce sempre 'False'.

Ho verificato che gli utenti con cui lavoro hanno i ruoli a cui sto tentando di autorizzare. Ho anche testato questi utenti in un'app WebForms che limita l'accesso alla pagina con gli stessi ruoli e funziona perfettamente. Immagino di avere qualcosa di sbagliato da qualche parte o mi manca qualcosa di semplice, ma dopo aver cercato tutta la mattina, non ho trovato nulla che mi abbia avvicinato alla soluzione, quindi spero che qualcuno qui possa darmi una mano.

+0

Ehi, potresti modificare la tua risposta per dirci quali sono state le configurazioni - potrebbe aiutare gli altri in futuro. – sirrocco

+0

sirrocco: le impostazioni di configurazione erano specifiche per l'implementazione e l'ambiente, quindi non sarebbero state di alcuna utilità per nessun altro. – Hamman359

+0

Il tuo commento mi ha spinto a ricontrollare il mio web.config e ho scoperto che il nodo roleManager aveva abilitato = "false". Volevo solo che la gente sapesse che se disabilitata restituisce false per IsInRole anziché restituire un'eccezione di qualche tipo come ci si potrebbe aspettare. –

risposta

4

Prima di tutto: utilizzare un profiler e quando si esegue la riga HttpContext.Current.User.IsInRole ("{roleName}"), verificare qual è la query sql.

Se non sta creando una query, probabilmente cacheRolesInCookie = "true" e IsInRole controlleranno FormsAuthenticationTicket per UserData. Assicurarsi che quando si crea il FormsAuthenticationTicket si imposta il parametro userdata su una stringa delimitata da virgole con i ruoli dell'utente.

+0

Grazie, questo non ha risolto il problema, ma mi ha portato su una strada che alla fine ha fatto. Risulta che ci sono state alcune impostazioni aggiuntive di configurazione necessarie per far funzionare il fornitore di ruoli pienamente funzionante che nessuno si è preso la briga di dirmi. Una volta inciampato su quelli, tutto 'magicamente' ha iniziato a funzionare. – Hamman359

+1

cos'era, ho lo stesso problema, puoi gentilmente farmi sapere –

0

Prova a svuotare la cache dei cookie del browser. Ho passato un po 'di tempo a sbattere la testa su un problema simile, e svuotare i miei biscotti ha risolto il problema.

0

Nel caso in cui gli altri a trovare questa domanda:

ho incontrato un problema simile e il problema è stato spazi nel gruppo di dominio. L'utilizzo dei ritorni HttpContext.Current.User, le chiamate a IsInRole() sembrano confrontare utilizzando il nome del gruppo precedente a Windows 2000 che non contiene spazi.

Nel mio caso, l'eliminazione degli spazi dal nome del gruppo passato a IsInRole() ha risolto il problema.

Ecco un metodo di estensione ingegnoso per fare questo:

/// <summary> 
/// Removes all spaces from a string 
/// </summary> 
/// <param name="value">The string</param> 
/// <returns>The string without spaces</returns> 
public static string StripSpaces(this string value) 
{ 
    // my test using both long and short strings showed StringBuilder 
    // to be slightly faster at this than string.Replace() 

    StringBuilder b = new StringBuilder(value); 

    b.Replace(" ", string.Empty); 

    return b.ToString(); 
} 

In alternativa è possibile utilizzare la System.DirectoryServices.AccountManagement.UserPrincipal e chiamare IsMemberOf() che dovrebbe funzionare meglio con gruppi di dominio che contengono spazi.

2

Ho avuto un problema simile come OP. Anche se questo è un vecchio post, ho pensato di mettere ciò che ha funzionato per me. Quello che ho trovato è che il fornitore di ruolo è stato disabilitato nel web.config. Ho impostato su true e ha risolto il mio problema.

<configuration> 
    <system.web> 
     <roleManager enabled="true" defaultProvider="myRoleProvider"> 
+0

Sì, lol, è così. Tutte queste soluzioni complicate e si rivela essere un semplice interruttore. Grazie. –

1

Un po 'di un argomento vecchio, ma ho avuto un problema simile e la causa era in:

FormsAuthentication.SetAuthCookie(string, bool) 

stavo usando token di identità dell'utente (GUID) come primo parametro, dato che il codice Stavo lavorando con usato una variabile denominata token, ma in realtà deve essere un nome utente valido. L'ho scoperto dopo aver usato il profiler e eseguito manualmente il proc memorizzato di aspnetdb. Anche il documento MSDN lo conferma.

Inoltre causa l'errore [Authorize(Roles="rolename")], anche se l'utente è nel ruolo, anche se [Authorize] funziona.

Problemi correlati