Получить пользователя (как 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);