Как реализовать пользовательские принципал и идентичность в ASP.NET MVC? - PullRequest
16 голосов
/ 18 июля 2010

Я хочу сохранить дополнительную информацию у аутентифицированного пользователя, чтобы он был легко доступен (например, User.Identity.Id) вместо просто имени, поскольку я планирую иметь эту неуникальную ,

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

Я видел, как добавить пользовательскую информацию в файл cookie аутентификации в свойстве пользовательских данных, но я хотел бы воспользоваться преимуществом внедрения зависимостей для модульного тестирования, которое я могу иметь с принципалом и удостоверением.

Какие точные шаги мне нужно учитывать, если я хочу реализовать свой Принципал или личность?

Что было бы проще всего сделать в этом сценарии (просто добавьте идентификатор и сохраните все значения по умолчанию)? «По умолчанию» будет включать поставщиков по умолчанию (членство, роли и т. Д.).

Я видел другой вопрос , но я был бы признателен за ответы, которые не оставляют пробелов между ними, такие как магические строки ролей в событии AuthenticateRequest в примерах. Вместо этого мне нужно знать, как добавить роли из SqlRoleProvider по умолчанию для текущего пользователя: когда и где это сделать, и если мне нужно сделать что-то еще, чтобы связать мои новые классы с другими поставщиками по умолчанию.

Было бы замечательно иметь возможность перейти к примеру приложения ASP.NET MVC 2 (например, из шаблона Visual Studio 2010), внести изменения и заставить его работать.


РЕДАКТИРОВАТЬ: Я отредактировал вопрос, чтобы лучше показать, что я в значительной степени потерял здесь, так что я не могу обойтись слишком высоким уровень ответов.

P.S .:: 1031 * Мне кажется, что имеет смысл иметь идентификатор в Идентичности вместо основного, хотя я, в некотором смысле, говорил об этом раньше.

Ответы [ 2 ]

20 голосов
/ 30 июля 2010

Этот вопрос задавался и отвечался ранее: ASP.NET MVC - установка пользовательского идентификатора или IPrincipal

Но подведем итог ...

Создайте пользовательский основной класс с дополнительными свойствами, которые вы хотите сохранить:

Public Class CustomPrincipal
    Inherits System.Security.Principal.GenericPrincipal

    Private _eyeColor As String
    Public ReadOnly Property EyeColor As String
        Get
            Return _eyeColor
        End Get
    End Property

    Public Sub New(id As System.Security.Principal.IIdentity, roles As String(), eyeColor As String)
        MyBase.New(id, roles)
        _eyeColor = eyeColor            
    End Sub

End Class

Измените global.asax Global.Application_AuthenticateRequest, чтобы использовать свой пользовательский принципал:

Protected Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As System.EventArgs)
    ...
    Dim roles() As String = {"examplerole"}         
    Context.User = new CustomPrincipal(Context.User.Identity, roles, "green")
End Sub

Тогда в другом месте вашего кода, когда вы хотите сослаться на одно из этих свойств, сделайте следующее:

CType(My.User.CurrentPrincipal, CustomPrincipal).EyeColor
2 голосов
/ 03 августа 2010

Вы не можете ожидать, что кто-то может научить вас всему, что вы не знаете о .NET, в нескольких параграфах. Вы можете прочитать довольно хороший пример на MSDN http://msdn.microsoft.com/en-us/library/system.security.principal.genericprincipal.aspx и покопаться в классе и его производных в Reflector - в этом нет ничего удивительного.

Роли - это просто строковый массив имен для вашего собственного использования в вашем приложении / сервере.

Сказав это, вам вовсе не обязательно стремиться к точному обобщенному производному вообще. Проверить

HttpContext.Current.Items

Это Hashtable для бесплатного использования только для запроса, который вы обслуживаете - это означает, что в какой-то момент вы можете сказать:

HttpContext.Current.Items["TokenUser"] = new MyThinUser(anything,I,want,there);

и затем все остальное в коде просто:

var user = HttpContext.Current.Items["TokenUser"] as MyThinUser;

и все готово.

Храните в своем новом классе все, что вам нужно / хотите передать от кода аутентификации всем остальным функциям. Оставляет свойство пользователя нетронутым (чтобы вы могли заглянуть в него и не беспокоиться о том, что вы что-то изменили). Вы можете упростить или усложнить свою систему, но сохраняете полную независимость.

Например, если у вас есть собственная аутентификация и несколько уровней доступа вместо перечисленных ролей, вы можете просто иметь старый добрый номер уровня доступа (перечисленные роли, переносимые как строки, в любом случае очень неэффективны).

Имейте в виду, что автоматически сгенерированные образцы в VS обычно ориентированы на определенный сценарий. Поэтому, если вы видите поставщиков SQL для управления пользователями, это не означает, что вам действительно нужно его использовать - вы все равно можете просто вызвать своего собственного sproc, чтобы получить то, что вам нужно, из своей собственной таблицы в SQL.

...