Подтвердить что ты не робот

Как реализовать пользовательский принцип и идентификатор в ASP.NET MVC?

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

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

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

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

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

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

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


EDIT: Я отредактировал вопрос, чтобы лучше показать, что я в значительной степени потерян, поэтому я не могу справиться с ответами на высоком уровне.

P.S.: Мне кажется, что имеет смысл иметь идентификатор в Identity вместо принципала, хотя я, в некотором смысле, заявил об этом раньше.

4b9b3361

Ответ 1

Этот вопрос задавали и отвечали раньше: ASP.NET MVC - установка пользовательского IIdentity или 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

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

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

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

HttpContext.Current.Items

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

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

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

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

и все готово.

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

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

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