2014-11-24 13 views
34

Quindi, qual è lo scopo per l'esistenza di entrambi IIdentity e IPrincipal e non alcuni IIdentityMergedWithPrincipal? Quando non è sufficiente implementare entrambi nella stessa classe?Qual è l'idea alla base di IIdentity e IPrincipal in .NET

Inoltre, per capire scopo, mi piacerebbe sapere dove questo concetto deriva da:

  • E 'nato in .Net
  • C'è concetto di Identità/Principal come modello di progettazione, che System.Security.Principal implementato in quelle interfacce
  • si originato altrove e supportato per la compatibilità

Pertanto, fa UserPrincipal da System.DirectoryServices agire in modo simile a IPrincipal ma non implementarlo per errore o intenzionalmente?

P.S. Sto cercando ragionamento dietro un'idea, non benefici/controversie confronto, quindi per favore cercate di non avviare opinione a base di discussione

+3

Hai letto i seguenti articoli dei molti altri che sono là fuori http://msdn.microsoft.com/en-us/library/ee748503.aspx Cosa non capisci. .? prova a leggere su 'PrincipalContect e penso che otterrai una migliore comprensione del come e del perché – MethodMan

+3

Le classi' Principal' di Active Directory non hanno assolutamente nulla a che fare con 'IIdentity' e' IPrincipal'. nel framework .NET di base. Quelli sono totalmente indipendenti e non sono correlati in alcun modo, forma o forma (tranne la denominazione ...) –

+0

Sicuramente, il principal di Active Directory non dipende in alcun modo da IPrincipal, tuttavia penso che ci sia una connessione implicita. Ad esempio: confronta IPrincipal.IsInRole (ruolo stringa) e UserPrincipal.IsMemberOf (gruppo GroupPrincipal). Penso che sia possibile scrivere un wrapper IPrincipal personalizzato attorno a UserPrincipal – Aloraman

risposta

45

IIdentity è solo utilizzato per autenticato l'identità dell'utente, indipendentemente da ciò che i ruoli che possono avere.

IPrincipal viene utilizzato per combinare l'identità di un utente con i ruoli autorizzati in un determinato contesto di sicurezza.

Ad esempio, è possibile utilizzare un provider di accesso di terze parti, come Facebook o Google, per ottenere l'identità dell'utente, ma non si otterrà un principal da tali provider, in quanto non forniscono alcun ruolo. È possibile utilizzare la propria applicazione o un provider di autorizzazioni basato su ruoli di terze parti per applicare i ruoli, ad esempio, a FacebookIdentity o GoogleIdentity. Un'applicazione diversa può aspettarsi un diverso principio, con i propri ruoli, ma usa comunque la stessa identità di un'altra applicazione.

+1

Quindi, ci ** sono ** utilizzati per separare il problema dell'autenticazione e dell'autorizzazione. Grazie per il tuo esempio, ora vedo che possono non essere dipendenti l'uno dall'altro, quindi entità separate. – Aloraman

+2

Un punto di confusione che ho trovato è che spesso le persone inseriscono proprietà relative all'identità (ad es. Nome, email) sull'implementazione di IPrincipal piuttosto che sull'Identity, perché non possono essere disturbati a digitare per es. User.Identity.Email (nei giorni di Intellisense e completamento automatico), e preferisce salvare alcune sequenze di tasti e inserire User.Email. –

+1

Quindi perché 'IIdentity' ha una proprietà' IsAuthenticated'? –

11

Un principal è il contesto di sicurezza di un utente.

Nel caso di .NET, un principal supporta il concetto di avere più di un'identità (Questo non ha nulla a che fare con le affermazioni ancora). Questo è particolarmente importante quando si tratta di semantica che gli sviluppatori devono affrontare quando si tratta dell'identità dell'utente. Potresti essere chiamato come sviluppatore per supportare più identità provenienti da fonti diverse (idp di provider di identità), ad esempio: Twitter, Google, qualunque cosa.

Quindi qual è la differenza tra un IPrincipal e IIDentity? IPrincipal è il contesto di sicurezza (per un singolo thread) e IIDentity è l'insieme di attributi associati a quell'utente provenienti da uno specifico provider/autorità di identità.

9

Come MSDN site dice:

L'identità oggetto incapsula informazioni sull'utente o entità in fase di convalida. Al loro livello più elementare, gli oggetti identità contengono un nome e un tipo di autenticazione.

mentre

Il preside oggetto rappresenta il contesto di protezione in cui il codice è in esecuzione.

Fare riferimento al collegamento sopra riportato per ulteriori informazioni.

HTH

-2
public class HBPrincipal : IPrincipal 
{ 
    private HBIdentity _identity; 

    public HBPrincipal(HBIdentity identity) 
    { 
     _identity = identity; 
    } 

    public IIdentity Identity 
    { 
     get 
     { 
      return _identity; 
     } 
    } 

    public bool IsInRole(string role) 
    { 
     // TODO implement roles 
     return false; 
    } 
} 
+3

Questo non sembra rispondere alla domanda. – Pang