Получить пользователя (как IPrincipal) по UserId или проверить роль любого пользователя?

Мой коллега написал некоторый простой код для тестирования, если у пользователя в нашей системе есть правильные данные в базе данных (например, владелец компании должен быть фактически установлен как владелец какой-либо компании, ему должны быть назначены правильные роли и т. Д.). Созданный им код помещается непосредственно в приложение MVC (а не полагается на код, написанный в базе данных), но он допустил небольшую ошибку и вместо проверки ролей какого-то конкретного пользователя он использовал HttpContext.Current.User, Механизм тестирования все еще находится на ранних стадиях и не нарушает работу приложения (даже если он работает неправильно). Коллеги нет на месте, и меня попросили исправить ошибку (хотя я должен был бы сделать это, даже если бы он был в офисе).

Есть несколько способов, которыми я могу исправить ошибку, но я думал о том, что похоже, что это не заставит меня переписать все с нуля. Я думал, что если бы я мог как-то получить пользователя по конкретному UserId (это то, что мы получаем на входе действия) как IPrincipal объект, который я не должен был бы изменить много кода. Однако я не могу найти какую-либо информацию о такой операции в Интернете.

Вкратце: я могу получить пользователя (кроме текущего) UserId и иметь результат как IPrincipal? Если да, то как мне этого добиться? Если нет, есть ли другой стандартный способ проверить, является ли конкретный пользователь (пользователь с определенным UserId) им назначена какая-то конкретная роль?

Конечно, я могу исправить некоторые функции в SQL для проверки ролей или вытащить UserProfile от UserId, извлечь имя, получить пользователя по имени и, наконец, проверить роли. Однако оба эти решения кажутся мне скорее обходным путем, и я бы предпочел использовать что-то более стандартное, если это возможно.

2 ответа

Решение

Будучи не в состоянии найти правильный ответ на вопрос, я закончил тем, что написал скалярную функцию в базе данных и использовал ее через linq. Код функции:

CREATE function [dbo].[UserIsInRole](@UserId int, @Role nvarchar(MAX))
RETURNS bit
AS
BEGIN
    DECLARE @amount int
    SELECT
        @amount = COUNT(UserId)
    FROM
        [dbo].webpages_UsersInRoles uir
        JOIN [dbo].webpages_Roles r ON
        (
            r.RoleId = uir.RoleId AND
            (
                r.RoleName = @Role OR
                @Role LIKE r.RoleName + ',%' OR
                @Role LIKE '%,'+ r.RoleName + ',%' OR
                @Role LIKE '%,'+ r.RoleName
            )
        )
    WHERE
        uir.UserId = @UserId
  RETURN IIF(@amount > 0, 1, 0)
END

Обратите внимание, что вы можете предоставить несколько ролей на входе, и функция вернет true, если рассматриваемый пользователь соответствует какой-либо из них.

Вы можете просто использовать метод SimpleRoleProvider.IsUserInRole, чтобы определить, играет ли какой-либо пользователь определенную роль. Ваш код будет выглядеть примерно так:

var roles = (WebMatrix.WebData.SimpleRoleProvider)Roles.Provider;
var isInRole = roles.IsUserinRole(username, roleName);
Другие вопросы по тегам