【问题标题】:How to call aspnet_UsersInRoles_IsUserInRole Stored Procedure with Dapper ORM如何使用 Dapper ORM 调用 aspnet_UsersInRoles_IsUserInRole 存储过程
【发布时间】:2025-12-17 16:20:03
【问题描述】:

我需要从 Aspnet Membership 调用 aspnet_UsersInRoles_IsUserInRole。我正在像这样进行简洁的调用:

public int CheckIfUserIsInRole(IsUserInRole userInRole)
    {
        using (var connection = new SqlConnection(ConfigurationSettings.GetConnectionString()))
        {
            DynamicParameters param = new DynamicParameters();
            param.Add("@UserName", userInRole.UserName);
            param.Add("@ApplicationName", userInRole.ApplicationName);
            param.Add("@RoleName", userInRole.RoleName);

         return    connection.Query("aspnet_UsersInRoles_IsUserInRole", param, commandType: CommandType.StoredProcedure).FirstOrDefault();               
        }
    }

在控制器中我添加:

    public int IsUserInRole(IsUserInRole isUserInRole)
    {            
        var model = _userRepository.CheckIfUserIsInRole(new IsUserInRole()
        {
            UserName = "testuser",
            RoleName = "user",
            ApplicationName = "USERMANAGEMENT"
        });

        return model;
    }

用户存在且角色正确,但每次都返回 0。 这是来自 AspNet Membership 的存储过程:

ALTER PROCEDURE [dbo].[aspnet_UsersInRoles_IsUserInRole]
@ApplicationName  nvarchar(256),
@UserName         nvarchar(256),
@RoleName         nvarchar(256)

作为 开始 声明 @ApplicationId 唯一标识符 选择@ApplicationId = NULL SELECT @ApplicationId = ApplicationId FROM aspnet_Applications WHERE LOWER(@ApplicationName) = LoweredApplicationName 如果(@ApplicationId 为空) 返回(2) 声明 @UserId 唯一标识符 选择@UserId = NULL 声明 @RoleId 唯一标识符 选择@RoleId = NULL

SELECT  @UserId = UserId
FROM    dbo.aspnet_Users
WHERE   LoweredUserName = LOWER(@UserName) AND ApplicationId = @ApplicationId

IF (@UserId IS NULL)
    RETURN(2)

SELECT  @RoleId = RoleId
FROM    dbo.aspnet_Roles
WHERE   LoweredRoleName = LOWER(@RoleName) AND ApplicationId = @ApplicationId

IF (@RoleId IS NULL)
    RETURN(3)

IF (EXISTS( SELECT * FROM dbo.aspnet_UsersInRoles WHERE  UserId = @UserId AND RoleId = @RoleId))
    RETURN(1)
ELSE
    RETURN(0)

结束

我在哪里弄错了? 有什么建议可以解决吗?

我需要这个存储过程来检查用户是否处于该角色,以便我可以将它用于 [AuthorizeRoles("RoleTest")]

【问题讨论】:

    标签: stored-procedures authorization asp.net-membership dapper


    【解决方案1】:

    那个存储过程不返回任何记录;它改为使用返回值。这需要作为参数处理:

    public int CheckIfUserIsInRole(IsUserInRole userInRole)
    {
        using (var connection = new SqlConnection(ConfigurationSettings.GetConnectionString()))
        {
            DynamicParameters param = new DynamicParameters();
            param.Add("@UserName", userInRole.UserName);
            param.Add("@ApplicationName", userInRole.ApplicationName);
            param.Add("@RoleName", userInRole.RoleName);
            param.Add("@ReturnValue", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);
    
            connection.Execute("aspnet_UsersInRoles_IsUserInRole", param, commandType: CommandType.StoredProcedure);
    
            return param.Get<int>("@ReturnValue");
        }
    }
    

    https://github.com/StackExchange/dapper-dot-net#stored-procedures

    (也发布到your copy of this question on CodeProject。)

    【讨论】: