9

Ecco lo sfondo. Ho avuto un progetto .NET MVC v1.0 che stavo cercando di proteggere utilizzando la modalità di autenticazione di Windows. Così mi sono messo il web.config per:La modalità di autenticazione di Windows in ASP.NET utilizza il nome del gruppo di Active Directory (pre-Windows 2000)?

<authentication mode="Windows" /> 

E poi andato nel mio controller e ha fatto la seguente:

[Authorize(Roles="IT")] 
public class LicenseController : Controller 

In dC abbiamo un gruppo chiamato "IT" e sono molti altri sono a parte questo gruppo. Una volta avuta questa impostazione, ho avviato una sessione di debug e ho provato ad andare a una qualsiasi delle azioni in quel controller e mi sono imbattuto in un 401. Cerco in alto e in basso in cerca di un posto in cui ho messo il cagnolino e non ho trovato nulla sbagliato. Dopo un po 'di difficoltà ho deciso di provare a cambiare "Autorizza" a un utente specifico e vedere se ha funzionato. Così ho cambiato il seguente:

[Authorize(Users="domain\\tnederveld")] 

E basso ed ecco che ha funzionato. Così sono andato e ho aggiunto un gruppo diverso di cui ero membro e ho preso la dichiarazione di autorizzazione degli utenti e questo ha funzionato. Ho iniziato a esaminare le differenze tra i due gruppi di annunci e l'unica cosa diversa era che nel secondo gruppo ho provato il "Nome gruppo (pre-Windows 2000):" erano gli stessi. I gruppi "IT" "Nome gruppo (pre-Windows 2000):" era "Associati IT". Così ho provato a cambiare la dichiarazione di autorizzazione su:

[Authorize(Roles="IT Associates")] 

E ha iniziato a funzionare. Ho pensato che si trattava di un problema di MVC, quindi per assicurarmi di averlo provato su un normale progetto Web Forms e di aver incontrato lo stesso problema.

Il vero kicker è che quando si utilizza UserPrincipal che fa parte di System.DirectoryServices.AccountManagement restituisce il gruppo "IT" quando si utilizza il metodo .GetGroups().

Perché sta succedendo?

+0

Terry, se si desidera includere XML o frammenti di codice nel post (buona idea!), È necessario evidenziare tali righe e quindi utilizzare il pulsante "codice" (101 010) sulla barra degli strumenti dell'editor (o premere Ctrl-K) per formattare correttamente quelli. –

risposta

3

È necessario tenere separate le varie nomi una voce in AD può avere:

  • il nome di per sé è in genere l'attributo CN - il nome comune. Questa è la parte "CN = xxx" nella tua stringa LDAP. Qui è IT - ed è quello che System.DirectoryServices.AccountManagement tornerà - è il "Active Directory" 's nome più comune

  • il 'associa' il nome è la pre-Windows 2000 o sAMAccountName - la cosa di Windows NT usato prima che esistesse AD: un nome utente e/o gruppo locale (SAM = Gestione account di sicurezza o qualcosa del genere). Il nome dell'account SAM deve essere univoco per dominio, anche in un'enorme foresta AD in questi giorni.

Purtroppo, un sacco di chiamate API di Windows sono ancora basate su quel nome - dal momento che sono (e devono essere) compatibile con le versioni precedenti di Windows. Il sistema di appartenenza ASP.NET utilizza queste chiamate e quindi utilizzerà il tuo nome utente e il gruppo IT Associates - quelli sono i nomi dell'account SAM dei tuoi oggetti

Non sai se c'è molto che puoi fare al riguardo - tieni presente che in un ambiente AD, qualsiasi utente o gruppo ha una pletora di "nomi" - sii sempre molto chiaro su di quale stai parlando!

Per un elenco dettagliato di tutti gli attributi AD, vedere excellent web site di Richard Mueller con Active Directory reference material.

+0

Completo di significato, grazie per aver risposto. –

Problemi correlati