2014-05-21 17 views
6

Mit WIF (Windows Identity Foundation) 4.5 erstellte Microsoft die Klasse WindowsPrincipal, die eine Art ClaimsPrincipal ist. Natürlich sind diese Klassen nicht portierbar, aber die Schnittstellen dahinter sind (IPrincipal). Das gleiche gilt für die ClaimsIndentity Klasse, die die IIdentity Schnittstelle implementiert.Wie verwenden Sie IPrincipal und IIdentity in den portablen Klassenbibliotheken?

Das Problem, das ich habe, ist, dass diese Klassen und WIF im Allgemeinen vollständig auf dem Konzept der "Ansprüche" basiert, das ist genial ... aber die beiden Schnittstellen, IPrincipal und IIdentity sind nicht. Nicht nur das, aber die Klasse hat auch eine Sammlung von Identitäten anstelle von nur einer einzigen damit verbundenen Identität.

  • IPrincipal hat Identity und IsInRole Mitglieder.
  • IIdentität hat AuthenticationType, IsAuthenticated und Name Mitglieder.
  • Angesichts der Tatsache, dass die Portable Class Libraries nur auf diese beiden Schnittstellen zugreifen können, wie geht man über die tatsächlichen Ansprüche?

    Auch in dem seltenen Fall, dass ein Prinzipal mehrere Identitäten hat, wie erhält man die "nicht-primären" Identitäten?

    +0

    Wie Sie gesagt haben, dass jeder ClaimsPrincipal haben mehrere Identitäten und jede Identität Sammlung von Ansprüchen, so dass Sie auf jede Identität zugreifen können, indem Sie in die Referenzvariable von ClaimsPrincipal gelangen. Wie ClaimsPrincipal.Identities [1] für die zweite nicht primäre Identität –

    Antwort

    4

    Microsoft zur Verfügung gestellt Ansprüche bewusst Typen in Microsoft.IdentityModel.dll, die nicht tragbar ist (noch, ich hoffe). Diese Typen erweitern nur aktuelle Identitätstypen, z. IPrincipal:

    public interface IClaimsPrincipal : IPrincipal 
    

    Es bedeutet, dass mit dem alten Code bewusst Typen sind compatibile behauptet, die IPrincipal und IIdentity Schnittstellen verwendet. Aber um Ihren Code Ansprüche bewusst machen müssen Sie einen Verweis auf Microsoft.IdentityModel.dll hinzufügen (die nicht als PCL verfügbar ist) oder schreiben Sie es von Grund auf neu.

    Wenn Sie testen wollen, wie alt Code verhält, wenn Instanzen Ansprüche bewusst Arten der Verarbeitung, die Sie gerade Downcasting an die IPrincipal Schnittstelle verwenden können:

    IClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(new List<IClaimsIdentity>() 
    { 
        new ClaimsIdentity("AuthType1"), 
        new ClaimsIdentity("AuthType2") 
    }); 
    
    IPrincipal principal = claimsPrincipal as IPrincipal; 
    IIdentity identity = principal.Identity;