GoranTozi Ответов: 1

Как вызвать хранимую процедуру aspnet_usersinroles_isuserinrole с помощью dapper ORM


Привет. Мне нужно вызвать aspnet_UsersInRoles_IsUserInRole из членства в Aspnet.Я делаю такой щеголеватый звонок:

с уважением.

Что я уже пробовал:

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.
У меня есть тестер с пользователями numerus, и я пытаюсь передать значение bool так же, как Execute и ExecutScalar, но все равно вызов возвращает 0 все время для всех пользователей.
Вот хранимая процедура из членства в AspNet:

USE [User2]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER OFF
GO

ALTER PROCEDURE [dbo].[aspnet_UsersInRoles_IsUserInRole]
    @ApplicationName  nvarchar(256),
    @UserName         nvarchar(256),
    @RoleName         nvarchar(256)
AS
BEGIN
    DECLARE @ApplicationId uniqueidentifier
    SELECT  @ApplicationId = NULL
    SELECT  @ApplicationId = ApplicationId FROM aspnet_Applications WHERE LOWER(@ApplicationName) = LoweredApplicationName
    IF (@ApplicationId IS NULL)
        RETURN(2)
    DECLARE @UserId uniqueidentifier
    SELECT  @UserId = NULL
    DECLARE @RoleId uniqueidentifier
    SELECT  @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)
END


Где я ошибаюсь? Есть какие-нибудь советы, как это исправить ?

Мне нужна эта хранимая процедура, чтобы проверить, находится ли пользователь в этой роли, чтобы я мог использовать ее для [AuthorizeRoles ("RoleTest")]

F-ES Sitecore

Мой совет-не изобретать велосипед заново, используйте API membership\identity, чтобы узнать, находится ли учетная запись в роли.

1 Ответов

Рейтинг:
12

Richard Deeming

Эта хранимая процедура не возвращает никаких записей; вместо этого она использует возвращаемое значение. Это должно быть обработано как параметр:

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");
    }
}

На GitHub - клиент StackExchange/щеголь-точка-Нэт: щеголь - простой объект сопоставителя для .Чистая[^]

(Также опубликовано в ваша копия этого вопроса на StackOverflow[^].)