В чем заключается идея 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;
    }
}
Другие вопросы по тегам