Как вручную установить роль пользователя в ASP.NET MVC?
этот проект, над которым я работаю, требует, чтобы я сохранил локальную БД пользователей admin и использовал внешнюю БД для обычных пользователей. Любому, кто проходит аутентификацию в БД администратора, должна быть назначена роль "администратор", а любому, кто прошел аутентификацию через другую БД, всегда будет назначена роль "пользователь".
можно ли вручную назначить эти роли? Мне не нужна сложность поставщика ролей или что-то еще, так как я использую только эти две роли, которые всегда будут основаны на том, какая БД они проверка подлинности.
было бы огромной помощью, если бы вы могли предоставить пример кода или ссылку на некоторую документацию. Спасибо!
EDIT:
В настоящее время я не использую поставщика ролей, и создание одного кажется хлопот. Я знаю, что это не "лучшая практика", но мне нужно только назначить 1 из 2 ролей во время входа в систему (это никогда не изменится). Также не имеет смысла хранить информацию о роли в базе данных, так как пользователи уже разделены на 2 dbs по их роли.
вот какой-то псевдокод:
if (AdminDB.ValidateUser(username,password)==true) {
SetAuthCookie(username);
AssociateUserWithRole(username, 'admin');
} elseif (UserDB.ValidateUser(username,password)==true) {
SetAuthCookie(username);
AssociateUserWithRole(username, 'user');
} else {
// Login failed.
}
Это ' ThisSession.Часть, которую я не знаю. В принципе, один пользователь аутентифицируется, мне нужно сказать .NET, к какой роли принадлежит пользователь.
4 ответов
реализация поставщика ролей не особенно сложно - особенно если вы только реализуете проверку ролей, а не управление ролями. Просто реализуйте те части, которые вам нужны, а остальные бросайте NotImplementedExceptions. Если у вас есть только одно приложение, вам не нужно слишком беспокоиться об этой части. Обратите внимание, что части, которые вам нужны, будут продиктованы тем, как фреймворк использует его, а не тем, как вы его используете. Я думаю, например, вам понадобится реализовать бит, возвращающий все роли пользователя, даже если вы хотите только проверить, находятся ли они в определенной роли.
тем не менее, вы можете опустить весь RoleProvider и сделать все это на сессии. В этом случае вы бы реализовали свой собственный атрибутом authorizeattribute и замените его биты аутентификации и проверки ролей своими собственными. Сохраните роль пользователя в сеансе после проверки подлинности и проверьте ее там с помощью атрибута и параметров, предоставленных атрибут для метода / класса, которым вы его украсили.
Если вы используете членство и роли, встроенные в asp.net затем посмотрите на AddUserToRole и RemoveUserFromRole:
http://msdn.microsoft.com/en-us/library/system.web.security.roles.addusertorole.aspx
на основе того, как они войти вы можете добавлять и удалять их по мере необходимости.
Я не мог сказать из вашего поста, если вы не используете поставщика ролей или если вы говорили, что не хотите создавать свой собственный поставщик ролей. Если нет ... используя встроенный поставщик ролей, вам придется использовать любой механизм кодирования, который у вас есть, чтобы переключить пользователя при входе в систему на основе того, как / откуда они входят.
EDIT: теперь, когда вы показали свой код и заявили, что не используете asp.net механизм ролей.
вы используете файлы cookie auth форм, поэтому переопределите authenticateRequest глобального.asax файл и настроить роли по мере необходимости и создать свой билет.
здесь образец в: http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.html
образец только "получает" роли, но вы можете добавить/изменить роли.
Я считаю, что эта статья (хотя и с 2003 года) четко описывает процесс назначения ролей пользователю и замены принципала по каждому запросу (аналогично тому, что делает NerdDinner):
авторизация пользователей с ролевой безопасностью: http://msdn.microsoft.com/en-us/library/aa289844%28v=vs.71%29.aspx
Если кто-то сталкивается с той же проблемой с OWIN, я думаю, это может помочь:
var identityResult = await manager.CreateIdentityAsync(login, "MyAppCookie");
if (<user is admin>)
identityResult.AddClaim(new System.Security.Claims.Claim(identityResult.RoleClaimType, "Admin"));
else
identityResult.AddClaim(new System.Security.Claims.Claim(identityResult.RoleClaimType, "User"));
HttpContext.Current.GetOwinContext().Authentication.SignIn(identityResult);