2009-12-01 3 views
5

Я хочу использовать AuthorizeAttribute для управления доступом пользователей к моим действиям. Я просто хочу уточнить, что моя логика в порядке.ASP.Net MVC Memberships

  1. создать свою собственную реализацию IPrincipal
  2. я отправляю учетные данные пользователя для входа в действие контроллера безопасности.
  3. Я проверить учетные данные с классом UserService и назначить IPrincipal вернулся из моего класса UserService в HttpContext.User
  4. Мой WebAuthorizeAttribute, который наследует AuthorizeAttribute, проверяет текущий HttpContext.User.Identity.IsAuthenticated и HttpContext.User.IsInRole чтобы определить, имеет ли пользователь доступ к действию.

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

ответ

4

Вам нужно будет где-то сохранить IPrincipal и восстановить его с каждым запросом. Если вы будете использовать FormsAuthentication, это хорошее решение:

ASP.NET 2.0 Forms authentication - Keeping it customized yet simple

вы можете найти другие решения здесь:

Where to store logged user information on ASP.NET MVC using Forms Authentication?

и Propably во многих других StackOverflow вопросы :)

EDIT

О MyBusinessLayerSecurityClass.CreatePrincipal (идентификатор, id.Name):

Вы должны прочитать эту страницу:

http://msdn.microsoft.com/en-us/library/aa480476.aspx

Специально это:

FormsAuthenticationModule класс строит GenericPrincipal объект и улица использует его в контексте HTTP . GenericPrincipal объект содержит ссылку на экземпляр FormsIdentity , который представляет текущий аутентифицированного пользователя. Вы должны разрешить проверку подлинности форм для управления этими задачами . Если приложения имеют специфические требования, такие как установка пользователя свойства пользовательского класса, который реализует интерфейса IPrincipal, приложение должно обрабатывать PostAuthenticate событие. PostAuthenticate событие происходит после FormsAuthenticationModule проверил формы аутентификации печенье и создал GenericPrincipal и FormsIdentity объектов. В этом коде, вы можете построить пользовательский IPrincipal объекта , который оборачивает FormsIdentity объекта, , а затем сохранить его в HttpContext. Пользователь Недвижимость.

FormsIdentity управляется автоматически после того, как вы установили cookie аутентификации. Все, что вам нужно сделать, это обернуть его в IPrincipal. Все это происходит, когда свойство HttpContext.Current.User не равно (это GenericPrincipal, которое вы вскоре замените). Когда HttpContext.Current.User имеет значение null, тогда не было cookie аутентификации, созданного ранее, и пользователь не аутентифицирован.

+0

Я читал много вопросов и внешних блогов, но ни один из них, похоже, не превратил всю эту часть в контекст. – scottm

+0

Вы могли бы объяснить часть MyBusinessLayerSecurityClass.CreatePrincipal (id, id.Name). Я не понимаю, как вы получаете FormsIdentity, если свойство HttpContext.Current.User равно null. – scottm

2

Я считаю, что следующие более характерно:

  1. создать свою собственную реализацию IPrincipal
  2. я отправляю учетные данные пользователя для входа в действие контроллера безопасности.
  3. Я проверяю учетные данные с помощью класса UserService и строят файл cookie, который имеет определенную идентифицирующую информацию для этого пользователя. Обычно используется FormsAuthentication.SetAuthCookie или некоторая комбинация методов использования этого класса.
  4. В событии AuthenticateRequest приложения проверьте файл cookie и назначьте Context.User. Примечание: Это значение автоматически присваивается Thread.CurrentPrincipal после события AuthenticateRequest. Это одноразовое присвоение, и после этого эти значения автоматически не синхронизируются.
  5. My WebAuthorizeAttribute, который наследует AuthorizeAttribute, проверяет текущий HttpContext.User.Identity.IsAuthenticated и HttpContext.User.IsInRole, чтобы определить, имеет ли пользователь доступ к действию.
+1

+1: Это то, что я тоже делаю. В моем сообщении объясняется, как проверить файл cookie. – LukLed

+0

отлично, спасибо за вход – scottm