Мы начали создавать приложение asp.net mvc. Приложение будет состоять из одной основной базы данных с пользователями, проектами, общими таблицами и т. Д. И многими базами данных (все с одинаковой структурой) с данными, относящимися к конкретному проекту. Использование может иметь несколько глобальных ролей (хранящихся в основной базе данных) и некоторые специфичные для проекта роли (хранящиеся в базе данных проекта), и каждый пользователь может быть связан со многими проектами.
Моя цель - создать систему аутентификации, которая будет поддерживать классическую аутентификацию по имени пользователя и паролю, а также аутентификацию OpenID (для этой цели мы используем DotNetOpenAuth) и систему авторизации, которая будет поддерживать систему ролей, которую я описал выше.
Но я сталкиваюсь с несколькими вопросами:
1.) Я думаю, что мы должны поддерживать обе опции аутентификации (имя пользователя / пароль и Ppenid) для одного пользователя, так что пользователям с именем пользователя / паролем не нужно будет создавать дополнительную учетную запись, когда они решат, что будут использовать OpenId, и я думаю, что мы должны поддерживать несколько OpenId для одного пользователя, как это делает SO (если какой-то провайдер не работает).
2.) Я думаю, что лучшая база данных для этого будет:
table Users (UserId (PK), LastActivityDate)
table UsernameLogins (UserId (PK,FK), Username, Password, IsApproved, IsLockedOut, LastLoginDate, LastLockedOutDate, etc...)
table OpenIdLogins(OpenIdUrl (PK), UserId(FK),LastLoginDate)
table Profiles(UserId(PK,FK), DisplayName(Unique), Email (Unique), FirstName, LastName, Address, Country, etc...)
table Roles(RoleName (PK), RoleType(1=GlobalRole,2=ProjectRole).
table UserRoles(UserId(FK,PK), RoleName(PK)).
3.) Нужно ли создавать собственных провайдеров (MembershipProvider, ProfileProvider, RoleProvider)? Кажется, что MembershipProvider не очень подходит для аутентификации OpenId (и, конечно, я могу поддерживать только базовые методы (GetUser, ValidateUser))? Должен ли я реализовать MembershipProvider только для логина и пароля? Я думаю, что ProfileProvider и RoleProvider не так сложно реализовать? Должен ли я просто использовать FormsAuthentication и использовать свои собственные «сервисы»?
Мы также используем NHibernate и Spring для DI.
Любой совет будет оценен.
Спасибо!