Получить все роли любого пользователя (да, не зарегистрированного в данный момент)

В приложении MVC у администратора есть CRUD-контроллер для управления пользователями. Теперь функциональность части редактирования необходимо расширить, и это включает в себя добавление вкладок, зависящих от роли. Они зависят от роли просматриваемого пользователя, а не от роли администратора, который их просматривает. Самый простой способ добиться этого - получить все роли этого пользователя в виде массива строк (или аналогичного), но как мне на самом деле их получить.

Существует ли предпочтительный метод получения всех ролей одного пользователя в SimpleMembership (на основе его UserId) или мне просто нужно исправить сохраненную функцию в базе данных и получить их через нее?

Написание функции не представляет большого труда, но эта проблема не выглядит чем-то, что мне нужно искать обходными путями.


person jahu    schedule 03.03.2015    source источник
comment
Вы видели этот пост: stackoverflow .com/questions/20858599/   -  person David Tansey    schedule 03.03.2015
comment
@DavidTansey Спасибо. GetRolesForUser похоже, что это может помочь, но мне придется проверить его дальше, если он действительно делает то, что мне нужно.   -  person jahu    schedule 03.03.2015


Ответы (2)


Используйте метод Roles.GetRolesForUser() https://msdn.microsoft.com/en-us/library/8h930x07(v=vs.110).aspx

string[] rolesArray = Roles.GetRolesForUser("username"); 

Строка представляет собой имя пользователя, содержащееся в файле aspnetdb.

Если вы хотите найти с помощью руководства, вы можете попробовать следующее:

Guid userId; // ID of user - you can populate this somehow
MembershipUser memUser = Membership.GetUser(userId);
string[] roles = Roles.GetRolesForUser(memUser.UserName);
person user1666620    schedule 03.03.2015
comment
Звучит как вещь. Если бы мне пришлось быть придирчивым, я бы сказал, что я хотел найти роли по UserId, а не по имени \ электронной почте, но я думаю, что это придется сделать ;) - person jahu; 03.03.2015
comment
@jahu Я почти уверен, что свойство UserName в aspnetdb должно быть уникальным. Если вы хотите найти по первичному ключу пользователя, я добавлю правку. - person user1666620; 03.03.2015
comment
К сожалению, UserId уже используется в контроллере CRUD, поэтому переходить сейчас на имя не очень хорошая идея, но ваш ответ действительно отвечает на мой вопрос (поскольку я хотел узнать способ простого членства для получения этих ролей). - person jahu; 03.03.2015
comment
Интерфейсы @jahu .NET IPrincipal/IIdentity вообще не имеют идентификаторов. Membership пользователи не могут иметь идентификаторы. Ф.э. некоторые пользователи могут быть объявлены в файле web.config без какого-либо идентификатора. Итак, RoleProvider использует name, а не id. И да, это имя должно быть уникальным. - person Mark Shevchenko; 03.03.2015

Вот хранимая процедура, о которой я упоминал в вопросе:

CREATE FUNCTION GetUserRoles
(
    @UserId int
)
RETURNS TABLE 
AS
RETURN 
(
    SELECT
        r.RoleName
    FROM
        dbo.webpages_UsersInRoles uir
        JOIN dbo.webpages_Roles r ON (r.RoleId = uir.RoleId)
    WHERE
        uir.UserId = @UserId
)
GO

Единственная причина, по которой следует использовать это вместо ответа пользователя 1666620, заключается в том, что вы хотите пропустить один ненужный запрос к БД. Предпочтительным методом использования этого решения было бы добавить эту функцию в ваш dbml (или ее эквивалент EF). Очевидно, это сначала нужно добавить в базу данных.

person jahu    schedule 03.03.2015