Интерфейсы IIdentity и IPrincipal

Я всегда видел IPrincipal и IIdentity, но я не видел никаких веских причин для этого, поэтому у меня есть собственный интерфейс, который объединяет два:

public interface IUser : System.Security.Principal.IIdentity, System.Security.Principal.IPrincipal {
    string Role { get; set; }
}

Затем я реализую интерфейс как:

public class User : IUser {
    public string Role { get; set; }

    public System.Security.Principal.IIdentity Identity {
        get { return this; }
    }

    public string AuthenticationType {
        get { throw new System.NotImplementedException(); }
    }

    public bool IsAuthenticated {
        get { throw new System.NotImplementedException(); }
    }

    public string Name {
        get { throw new System.NotImplementedException(); }
    }

    public bool IsInRole(string role) {
        throw new System.NotImplementedException();
    }
}

Этот запах ? У меня есть проблема с безопасностью здесь?

11 голосов | спросил Andy Edinborough 25 MaramFri, 25 Mar 2011 08:12:48 +03002011-03-25T08:12:48+03:0008 2011, 08:12:48

2 ответа


8

Несмотря на то, что вам необходимо отделить Принципала от Identity, во многих приложениях это не так, и это различие только усложнит код. То, как безопасность лучше всего обрабатывается в приложении, во многом зависит от индивидуальных потребностей конкретного приложения.

Статья Мартина Фаулера Работа с ролями содержит подробный анализ различных шаблонов, которые могут использоваться для обеспечения защиты на основе ролей и указания необходимости для каждого шаблона.

В общем, вы не можете сделать предположение, что решение, отделяющее принципал от идентификатора, является оптимальным решением для всех приложений. Я столкнулся со многими сценариями, где это было лишним, и добавил ничего, кроме дополнительных классов. В этом случае лучше объединить два интерфейса.

Кроме того, это интерфейсы не классы . Интерфейс обозначает «имеет отношение между экземпляром и определением, где в качестве класса означает отношение« ». Экземпляр User в примере OP - это объект, который имеет как идентификатор, так и принципал (контекст безопасности). Вы всегда можете сломать все до уровня сложности, но , если функциональность приложения не указывает на разумную необходимость отделить класс, то зачем вы это делаете?

ответил smartcaveman 2 AMpSat, 02 Apr 2011 00:27:15 +040027Saturday 2011, 00:27:15
2

Эти интерфейсы предназначены для работы с информацией об идентификаторе пользователя .

  • IIdentity : объект идентификации представляет пользователя, от имени которого работает код.
  • IPrincipal : Основной объект представляет контекст безопасности пользователя, от имени которого работает код, включая идентификацию пользователя (IIdentity) и любые роли, к которым они принадлежат.

Просто взглянув на документацию, ваша реализация выглядит странно. Вы постоянно привязываете личность пользователя к фиксированной роли. Насколько я понимаю, пользователь может работать с разными ролями в разное время . Это обеспечивает лучшую инкапсуляцию. Основная проблема «дизайна», которую я вижу, - это ваша личность, которая теперь содержит личность, содержащую личность, внутри, ... тождество, и там ... вы получаете смысл.

Более того, возможно, по умолчанию реализации IIdentity и IPrincipal уже может помочь вам? Взгляните на общие реализации .

ответил Steven Jeuris 25 MarpmFri, 25 Mar 2011 16:26:16 +03002011-03-25T16:26:16+03:0004 2011, 16:26:16

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132