2016-01-22 7 views
8

Ho una messa a punto del progetto asp.net5 per utilizzare l'autenticazione di Windows. Quando imposto un punto di interruzione e guardo l'utente, vedo che c'è un array di reclami che contiene i SID di gruppo. Come ottengo il nome effettivo del gruppo dalle rivendicazioni?AspNet5 - autenticazione di Windows ottenere il nome di gruppo da pretese

sto cercando di limitare le finestre utente connesso utilizzando i gruppi di Active Directory che appartengono a, e sto lottando la sua creazione.

Domande: Come posso vedere i gruppi di Active Directory che l'utente collegato appartiene? Come si convertono i GroupSID in un nome di gruppo? Devo includere qualcosa nel file startup.cs per limitare determinati gruppi alle chiamate di servizio REST?

Vedo esempi di impostazione rivendicazioni basate manualmente sul utente collegato. Sono interessato all'utilizzo dell'utente Windows autenticato e dei relativi gruppi per limitare l'accesso.

Grazie

risposta

3

Non è così. Sfortunatamente non è così che funziona l'autenticazione di Windows. È possibile controllare solo se un utente ha un ruolo (e c'è un requisito relativo alla politica per quello), non enumerare i ruoli in cui si trova - che accetta i servizi di directory e che non è stato portato su core.

(Una cosa da notare è che, err, User.IsInRole() è rotto in questo momento per le identità di Windows che sarà fissato in RC2.)

+0

Grazie per la risposta. Posso tirare giù RC2 ora? O la RC2 non è ancora disponibile? È facile come asp.net 4 in cui decoro un metodo di riposo con [Autentica] e [Autorizza ("nomegruppo")] o dovrò scrivere un mucchio di codice personalizzato? –

+0

Non puoi ancora averlo. Presto. E una volta che funziona, sì, sarà lo stesso se non vuoi usare le politiche. Puoi semplicemente fare [Autorizza (Ruoli = '')] – blowdart

+0

@blowdart ogni volta che hai a portata di mano il problema github per il motivo per cui IsInRole() è rotto, o capita di sapere come è rotto? – JosephGarrone

11

Si può effettivamente ancora possibile ottenere il nome del gruppo utilizzando la seguente:

var test = new System.Security.Principal.SecurityIdentifier("S-1-5-21-3290390516-4063083420-3538132138-1146").Translate(typeof(System.Security.Principal.NTAccount)).ToString(); 

Così, per esempio:

var roles = ((ClaimsIdentity)_context.User.Identity).Claims.Where(q => q.Type == ClaimTypes.GroupSid).Select(q => q.Value); 

_logger.LogInformation($"Got {roles.Count()} roles"); 

foreach (var role in roles) 
{ 
    var name = new System.Security.Principal.SecurityIdentifier(role).Translate(typeof(System.Security.Principal.NTAccount)).ToString(); 
    _logger.LogInformation($"Got role {role}"); 
} 

Uscite:

(namespace).Authorization.Handlers.SiteHandler: Information: Got 18 roles 
(namespace).Authorization.Handlers.SiteHandler: Information: Got role (redacted)\Domain Users 
(namespace).Authorization.Handlers.SiteHandler: Information: Got role Everyone 
(namespace).Authorization.Handlers.SiteHandler: Information: Got role (redacted)\(redacted) Backend 
(namespace).Authorization.Handlers.SiteHandler: Information: Got role (redacted)\(redacted) Dashboards 
(namespace).Authorization.Handlers.SiteHandler: Information: Got role BUILTIN\Performance Log Users 
(namespace).Authorization.Handlers.SiteHandler: Information: Got role BUILTIN\Users 
(namespace).Authorization.Handlers.SiteHandler: Information: Got role NT AUTHORITY\INTERACTIVE 
(namespace).Authorization.Handlers.SiteHandler: Information: Got role CONSOLE LOGON 
(namespace).Authorization.Handlers.SiteHandler: Information: Got role NT AUTHORITY\Authenticated Users 
(namespace).Authorization.Handlers.SiteHandler: Information: Got role NT AUTHORITY\This Organization 
(namespace).Authorization.Handlers.SiteHandler: Information: Got role LOCAL 
(namespace).Authorization.Handlers.SiteHandler: Information: Got role (redacted)\jira-users 
(namespace).Authorization.Handlers.SiteHandler: Information: Got role (redacted)\jira-developers 
(namespace).Authorization.Handlers.SiteHandler: Information: Got role (redacted)\(redacted)_PDMS_DE_ALL 
(namespace).Authorization.Handlers.SiteHandler: Information: Got role (redacted)\(redacted)_PDMS_BE_ALL 
(namespace).Authorization.Handlers.SiteHandler: Information: Got role (redacted)\(redacted)Developers 
(namespace).Authorization.Handlers.SiteHandler: Information: Got role (redacted)\(redacted)_TEST 
(namespace).Authorization.Handlers.SiteHandler: Information: Got role (redacted)\(redacted)_PDMS_DB_ALL 

Nota, l'inserimento dei ruoli del dominio può richiedere un secondo o due.

+0

Questo è veramente utile, fino a quando RC2 non viene rilasciato. Good –

+3

C'è un modo migliore per farlo ora che 1.0 è fuori? – Charles