Как вручную установить роль пользователя в ASP.NET MVC?
Этот проект, над которым я работаю, требует, чтобы я поддерживал локальный db пользователей admin и использовал внешний db для обычных пользователей. Каждому, кто передает аутентификацию в admin db, должна быть назначена роль "admin", а любому, прошедшему аутентификацию через другой db, всегда будет назначена роль пользователя.
Могу ли я вручную назначить эти роли? Мне не нужна сложность провайдера ролей или чего-то еще, поскольку я использую только эти две роли, которые будут ВСЕГДА основываться на том, с каким db они аутентифицируются.
Это была бы ОГРОМНАЯ помощь, если бы вы могли предоставить пример кода или ссылку на какую-либо документацию. Спасибо!
EDIT:
В настоящее время я не использую поставщика роли, и создание похожее на проблему. Я знаю, что это не "лучшая практика", но мне нужно только назначить 1 из 2 ролей во время входа в систему (это никогда не изменится). Также не имеет смысла хранить информацию о роли в базе данных, поскольку пользователи уже разделены на две части по своей роли.
Вот некоторый псевдокод:
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.AssociateUserWithRole" я не знаю. В принципе, один пользователь аутентифицирован, мне нужно указать .NET, к какой роли принадлежит пользователь.
Ответы
Ответ 1
Реализация поставщика роли не особенно тяжела - особенно если вы выполняете проверку роли, а не управление ролью. Просто реализуйте те части, которые вам нужны, и остальное выложите NotImplementedExceptions. Если у вас есть только одно приложение, вам не нужно слишком беспокоиться об этой части. Обратите внимание, что части, которые вам нужны, будут определяться тем, как использует инфраструктура, а не как использовать ее. Я думаю, например, вам нужно будет реализовать бит, который возвращает все роли пользователя, даже если вы хотите только проверить, находятся ли они в определенной роли.
Тем не менее, вы можете опустить весь RoleProvider и сделать все это на Сессии. В этом случае вы можете реализовать собственный AuthorizeAttribute и заменить его битами проверки подлинности и проверки роли на свой собственный. Сохраните роль пользователя в сеансе после проверки подлинности и проверьте его там, используя свой атрибут, и параметры, предоставленные атрибуту для метода/класса, который вы его украсили.
Ответ 2
Если вы используете членство и роли, встроенные в asp.net, посмотрите на AddUserToRole и RemoveUserFromRole:
http://msdn.microsoft.com/en-us/library/system.web.security.roles.addusertorole.aspx
В зависимости от того, как они вошли в систему, вы можете добавлять и удалять их по мере необходимости.
Я не могу сказать с вашего поста, если вы не используете поставщика ролей, или если вы говорите, что не хотите создавать свой собственный поставщик ролей. Если вы не используете встроенный ролевой провайдер, вам придется использовать любой механизм кодирования, который у вас есть, чтобы переключать пользователя при входе в систему, исходя из того, как они/откуда они входят.
EDIT: Теперь, когда вы показали свой код и заявили, что вы не используете механизм ролей asp.net.
Вы используете формы auth cookie, которые, как представляется, переопределяют аутентификациюRequest файла global.asax и устанавливают роли по мере необходимости и создают ваш билет.
Здесь образец в:
http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.html
Образец только "получает" роли, но вы можете добавлять/изменять роли здесь.
Ответ 3
Я считаю, что эта статья (хотя с 2003 года) четко описывает процесс назначения ролей пользователю и заменяет принципала на каждый запрос (аналогично тому, что делает NerdDinner):
Авторизация пользователей с защитой на основе ролей:
http://msdn.microsoft.com/en-us/library/aa289844%28v=vs.71%29.aspx
Ответ 4
Если кто-то сталкивается с той же проблемой с 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);