ASP.NET MVC: взаимосвязь между MembershipUser, удостоверением, MembershipProvider и принципалом

#c# #asp.net-mvc #forms-authentication

#c# #asp.net-mvc #формы-аутентификация

Вопрос:

Мне нужна некоторая функциональность в ASP.NET Приложение MVC и после проведения некоторых исследований я чувствую, что мне нужно реализовать пользовательские MembershipUser, MembershipProvider, Identity и Principal. Моя проблема в том, что я не понимаю взаимосвязи, если таковая имеется, между MembershipUser и Identity и где именно MembershipProvider и Principal входят в картину. Не мог бы кто-нибудь, пожалуйста, пролить немного света. В Интернете есть несколько статей и руководств по всем четырем игрокам, но ни в одной из них не рассматривается взаимосвязь между ними полностью.

Также: существует ли элегантный способ присвоения пользовательского участника контексту.Пользователь, отличный от во время AuthenticateRequest в Global.asax? Я видел много примеров того, как это сделать в ASP.NET Приложения WebForms, и мне было интересно, если ASP.NET У MVC есть лучший способ.

Ответ №1:

IPrincipal — это контекст безопасности, который создается для каждого веб-запроса и содержит информацию, связанную с идентификатором пользователя и ролями, которые у него есть.

IPrincipal содержит IIdentity , который имеет свойства Name , IsAuthenticated и AuthenticationType .

пользовательский MembershipProvider — это класс, который является производным от абстрактного класса MembershipProvider для предоставления пользовательских данных о пользователях, использующих ваше приложение. Поставщик будет работать с MembershipUser типами и может использоваться для получения данных по конкретному пользователю или пользователям, создания новых пользователей и т.д. Вы можете наследовать от MembershipUser , чтобы создать свой собственный тип пользователя, и обычно можете захотеть сделать это, также используя своего собственного провайдера.

Когда вы получаете доступ к приложению, IPrincipal и IIdentity создаются и назначаются HttpContext.Current.User и Thread.CurrentPrincipal для предоставления информации о безопасности для любых действий, которые могут быть предприняты в течение срока действия запроса.

Если вы используете a RoleProvider , то создается RolePrincipal экземпляр type, который подключается к сконфигурированному RoleProvider , чтобы получить роли для пользователя; если вы не используете a, RoleProvider тогда GenericPrincipal создается экземпляр type.

Если вы используете проверку подлинности в формах и пользователь вошел в систему, то создается экземпляр FormsIdentity типа; если пользователь не аутентифицирован, то создается экземпляр GenericIdentity типа. IIdentity Созданное — это то, что в конечном итоге будет сериализовано в файл cookie аутентификации, передаваемый обратно браузеру, и что будет использовано для создания FormsAuthenticationTicket и IIdentity при следующем запросе.

MembershipProvider Вписывается в это, предоставляя дополнительную информацию о пользователе. метод статического Membership класса GetUser() будет использовать текущий IIdentity.Name и сконфигурированный MembershipProvider для возврата экземпляра MembershipUser (или производного класса, если вы его определили), содержащего данные о пользователе.

Поскольку ASP.NET MVC построен поверх ASP.NET конвейер обработки, место, где вы хотели бы установить свой собственный IIdentity и IPrincipal , совпадает. Насколько я знаю, в архитектуре MVC нет лучшего места для их установки.

Примечание: все это из памяти. Если я что-то перепутал, пожалуйста, дайте мне знать, и я обновлю.

Комментарии:

1. Обратите внимание, что в MVC 5 Microsoft отказалась от MembershipProvider в пользу ASP.net Идентификация.