В чем заключается идея IIdentity и IPrincipal в.NET
Итак, какова цель существования обоих IIdentity
а также IPrincipal
а не некоторые IIdentityMergedWithPrincipal
? Когда недостаточно реализовать оба в одном классе?
Также, чтобы понять цель, я хотел бы знать, откуда взялась эта концепция:
- Происходит из.Net
- Существует концепция идентичности / принципала как шаблона проектирования, который
System.Security.Principal
реализовано в этих интерфейсах - Он создан где-то еще и поддерживается для совместимости
Следовательно, делает UserPrincipal
от System.DirectoryServices
действовать аналогично IPrincipal
но не реализовать это случайно или намеренно?
PS Я ищу обоснование идеи, а не сравнение преимуществ / противоречий, поэтому, пожалуйста, постарайтесь не начинать обсуждение на основе мнения
4 ответа
IIdentity
используется только для удостоверенной личности пользователя, независимо от того, какие роли он может иметь.
IPrincipal
используется для объединения личности пользователя с авторизованными ролями, которые они выполняют в данном контексте безопасности.
Например, вы можете использовать стороннего провайдера входа в систему, такого как Facebook или Google, чтобы получить личность пользователя, но вы не получите принципала от этих провайдеров, поскольку они не предоставляют никаких ролей. Вы можете использовать свое собственное приложение или стороннего поставщика авторизации на основе ролей для применения ролей, скажем, к FacebookIdentity
или же GoogleIdentity
, Другое приложение может ожидать другого участника с его собственными ролями, но при этом использовать ту же идентификационную информацию, что и в другом приложении.
Принципал - это контекст безопасности пользователя.
В случае.NET принципал поддерживает концепцию наличия нескольких идентификаторов (это пока не имеет ничего общего с утверждениями). Это особенно важно, когда речь идет о семантике, с которой разработчики должны иметь дело, когда дело доходит до идентификации пользователя. Вас могут пригласить в качестве разработчика для поддержки нескольких идентификаторов, поступающих из разных источников (IdP провайдеров идентификации), например: Twitter, Google и так далее.
Так чем же отличается IPrincipal от IIDentity? IPrincipal - это контекст безопасности (для одного потока), а IIDentity - это набор атрибутов, связанных с этим пользователем, поступающих от конкретного поставщика / органа идентификации.
Как говорится на сайте MSDN:
Объект идентичности инкапсулирует информацию о проверяемом пользователе или объекте. На самом базовом уровне объекты идентичности содержат имя и тип аутентификации.
в то время как
Основной объект представляет контекст безопасности, в котором выполняется код.
Обратитесь по ссылке выше для получения дополнительной информации.
НТН
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;
}
}