2010-07-18 6 views
16

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

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

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

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

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

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

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


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

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

+0

У вас в настоящее время установлены аутентификация и ротация форм? –

+0

Делаю. Я начал с веб-приложения MVC (в отличие от MVC * Empty * Web Application) из шаблонов VS 2010, поэтому у него есть все поставщики SQL по умолчанию для управления пользователями: членство и роли включены. Но большая часть его делается за шторами. По соглашению, как бы –

+0

вы не можете использовать поддержку профиля для такого рода вещей? Это то, что для него (дополнительные данные, связанные с пользователем) - должно быть проще, чем пытаться создать «пользовательский пользователь». Я думаю, –

ответ

20

Этот вопрос был задан и ответил раньше: ASP.NET MVC - Set custom IIdentity or IPrincipal

Но обобщать ...

Crate пользовательских основного класса с дополнительным Properites вы хотите сохранить:

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 
+0

Seth - Откуда вы получаете «зеленый»? Вы извлекаете его из базы данных в каждом приложении Application_AuthenticateRequest? Вы сохраняете его в переменной сеанса? – mga911

+0

@ mga911 - В этом примере «зеленый» жестко закодирован. В реальном веб-приложении я бы прочитал его из базы данных и, возможно, сохранил его в файле cookie. При дополнительных вызовах AuthenticateRequest он может быть прочитан из файла cookie для предотвращения вызовов db. Сеанс varaibles не является вариантом здесь, потому что AuthenticateRequest вызывается перед SessionStart. –

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); 

, а затем everythere еще в коде просто сделать:

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

и все готово.

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

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

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

+0

Это интересный подход. – Dementic