подробные разрешения; PrincipalPermission - роли отделены от разрешений;

Я некоторое время использую PrincipalPermission в службах wcf. [PrincipalPermission(SecurityAction.Demand, Role = SecurityRoles.CanManageUsers)]

Наши роли имеют префикс: Can*, и именно так мы достигаем детального контроля действий с помощью встроенной системы членства asp.net.

Из-за этого бизнес-подразделению трудно понять, какие детализированные роли мы можем дать пользователю.

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

1) aspnet_roles - роль бизнес-подразделения

2) Расширьте систему членства asp.net, создав таблицу разрешений, таблицу Role_Permission и таблицу User_Permission (многие ко многим)

3) создайте пользовательский атрибут CodeAccessSecurityAttribute +, который просматривает новые таблицы [CustomPermissionCheck(Security.Demand, HasPermission="can*")] на первой итерации я буду статически новым зависимым репозиторием. IPermissionRepository.HasPermission(...);

Если я подойду к новому пути aop, я, вероятно, перестану наследовать CodeAccessSecurityAttribute — что скажут по этому поводу специалисты по безопасности?

кто-нибудь еще решил это, есть ли что-то в рамках, что я пропустил?


person Leblanc Meneses    schedule 03.05.2010    source источник


Ответы (2)


Я бы сказал, что если вы используете ASP.NET, вам следует реализовать настраиваемый поставщик ролей.

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

Затем, когда вы узнаете пользователя, вы можете узнать, в какую бизнес-группу он входит, и назначить все соответствующие роли в RoleProvider, не изменяя существующий код, который у вас есть.

Он также работает лучше, потому что позволяет вам легко изменять, какие группы имеют какие разрешения, сохраняя при этом модель предметной области для разрешений чистой на стороне кода.

person casperOne    schedule 03.05.2010

Я реализовал первую итерацию, и она работает хорошо. [PermissionValidate(SecurityAction.Demand, HasPermission = CensusSchedulerRoles.CanUpdateCensusScheduler)]

public void Demand()
{
    var principal = Thread.CurrentPrincipal;
    if(principal == null || principal.Identity.IsAuthenticated == false)
    {
        throw new SecurityException("Unable to get IPrincipal.");
    }
    if(principal.Identity.IsAuthenticated == false)
    {
        throw new SecurityException("You must be authenticated.");
    }   
     #warning this should be moved to an aop attribute that is injected by a ioc container.
    using (var connection = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["......."].ConnectionString))
    {
        connection.Open();
        using(var command = new SqlCommand(
        @"
            SELECT COUNT(t.name) FROM
            (
                SELECT p.name, u.UserName FROM 
                    aspnet_Users as u
                    INNER JOIN [User_Permission] as up
                        ON up.user_id = u.UserId
                    INNER JOIN Permission as p
                        ON p.id = up.permission_id
                UNION
                SELECT p2.name, u2.UserName FROM 
                    aspnet_Users as u2
                    INNER JOIN aspnet_UsersInRoles as uir
                        ON uir.UserId = u2.UserId
                    INNER JOIN aspnet_Roles as r
                        ON r.RoleId = uir.RoleId
                    INNER JOIN Role_Permission as rp
                        ON rp.role_id = r.RoleId
                    INNER JOIN Permission as p2
                        ON p2.id = rp.permission_id
            ) as t
            WHERE t.UserName = @username AND t.name = @haspermission
        ", connection))
        {
            command.Parameters.Add("@username", SqlDbType.VarChar).Value = Thread.CurrentPrincipal.Identity.Name;
            command.Parameters.Add("@haspermission", SqlDbType.VarChar).Value = _permissionRequested;

            if( Convert.ToInt32(command.ExecuteScalar()) <=0)
            {
                throw new SecurityException(String.Format("User '{0}' is not assigned permission '{1}'.", principal.Identity.Name, _permissionRequested));
            }
        }
    }
}
person Leblanc Meneses    schedule 15.05.2011