Вземете всички роли на всеки потребител (да, в момента не е регистриран такъв)

В 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 потребители не могат да имат идентификатори. F.e. някои от потребителите могат да бъдат декларирани във файл 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

Единствената причина да използвате това вместо отговора от user1666620, би била, ако искате да пропуснете една ненужна заявка към DB. Предпочитаният метод за използване на това решение би бил да добавите тази функция към вашия dbml (или неин EF еквивалент). Очевидно това първо трябва да се добави в базата данни.

person jahu    schedule 03.03.2015