Как вы используете IPrincipal и IIdentity в переносимых библиотеках классов?

В WIF (Windows Identity Foundation) 4.5 Microsoft создала WindowsPrincipal , который является типом ClaimsPrincipal < / а>. Конечно, эти классы не переносимы, но интерфейсы, стоящие за ними, являются (IPrincipal). То же самое можно сказать и о классе ClaimsIndentity реализация интерфейса IIdentity.

Проблема, с которой я столкнулся, заключается в том, что эти классы и WIF в целом полностью основаны на концепции «требований», что замечательно ... но два интерфейса, IPrincipal и IIdentity - нет. Более того, класс ClaimsPrincipal также имеет набор идентификаторов, а не только один связанный с ним идентификатор.

  • IPrincipal имеет Identity и IsInRole участников.
  • IIdentity состоит из AuthenticationType, IsAuthenticated и Name участников.

Учитывая тот факт, что переносимые библиотеки классов могут получить доступ только к этим двум интерфейсам, как можно получить фактические утверждения?

Кроме того, в том редком случае, когда у принципала есть несколько идентификаторов, как можно получить «непервичные» идентификаторы?


person michael    schedule 21.05.2014    source источник
comment
Как вы уже сказали, каждый ClaimsPrincipal имеет несколько удостоверений, и каждое удостоверение имеет набор утверждений, поэтому вы можете получить доступ к любому удостоверению, перейдя в ссылочную переменную ClaimsPrincipal. Как ClaimsPrincipal.Identities [1] для второго непервичного идентификатора   -  person Zaid Iqbal    schedule 19.06.2014


Ответы (1)


Microsoft предоставила типы, поддерживающие утверждения, в Microsoft.IdentityModel.dll, который не является переносимым (пока, я надеюсь). Эти типы просто расширяют текущие типы удостоверений, например. IPrincipal:

public interface IClaimsPrincipal : IPrincipal

Это означает, что типы, поддерживающие утверждения, совместимы со старым кодом, который использует интерфейсы IPrincipal и IIdentity. Но чтобы ваш код учитывал утверждения, вы должны добавить ссылку на Microsoft.IdentityModel.dll (который недоступен как PCL) или написать его с нуля.

Если вы хотите проверить, как ведет себя старый код при обработке экземпляров типов, поддерживающих утверждения, вы можете просто использовать приведение к интерфейсу IPrincipal:

IClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(new List<IClaimsIdentity>()
{
    new ClaimsIdentity("AuthType1"),
    new ClaimsIdentity("AuthType2")
});

IPrincipal principal = claimsPrincipal as IPrincipal;
IIdentity identity = principal.Identity;
person johnnyno    schedule 19.06.2014
comment
К вашему сведению, пространство имен Microsoft.IdentityModel не является WIF 4.5. WIF 4.5 был включен в .NET 4.5, поэтому все надлежащие пространства имен начинаются с System. например System.IdentityModel, System.Security.Claims. Если вы посмотрите вокруг, есть руководства по миграции. - person StilgarISCA; 12.09.2018