通过UserId获取用户(作为IPrincipal)或检查任何用户的角色?

时间:2014-05-30 11:51:45

标签: asp.net-mvc membership-provider simplemembership

我的一位同事写了一些简单的代码来测试我们系统中的用户是否在数据库中有正确的数据(例如,公司所有者需要实际设置为某公司的所有者,分配给他的正确角色等)。他所做的代码直接放在MVC应用程序中(而不是依赖于在数据库中编写的代码),但他犯了一个小错误而不是验证某个特定用户的角色,而是使用了HttpContext.Current.User。测试机制仍处于早期阶段,并且不会以任何方式破坏应用程序(即使它工作不正常)。这位同事不在办公室,我被要求修复这个错误(即使他在办公室,我也必须这样做)。

我可以通过多种方式修复错误,但我想的是一个看起来不会让我从头开始重写所有内容的方法。我在想,如果我能以某种方式通过特定的UserId(我们得到的动作输入)获得一个用户作为IPrincipal对象,我就不用了改变了很多代码。但是,我似乎无法在互联网上找到有关此类操作的任何信息。

简而言之: 我可以UserId获取用户(当前除外)并将结果设为IPrincipal吗? 如果是,我该如何实现? 如果不是,是否有其他标准方法可以检查特定用户(具有特定UserId的用户)是否分配了某些特定角色?

当然我可以在SQL中修补一些函数来检查角色或者通过UserProfile提取UserId,提取名称,通过名称获取用户并最终检查角色。然而,这些解决方案听起来更像是一种解决方法,如果可能的话,我宁愿使用更标准的东西。

2 个答案:

答案 0 :(得分:0)

由于无法找到问题的正确答案,我最终在数据库中编写标量函数并通过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。

答案 1 :(得分:0)

您可以使用SimpleRoleProvider.IsUserInRole方法确定是否有任何用户具有特定角色。您的代码看起来像这样:

var roles = (WebMatrix.WebData.SimpleRoleProvider)Roles.Provider;
var isInRole = roles.IsUserinRole(username, roleName);