2

私は wcf サービスでしばらく PrincipalPermission を使用しています。[PrincipalPermission(SecurityAction.Demand, Role = SecurityRoles.CanManageUsers)]

私たちの役割には接頭辞 Can* が付いており、組み込みの asp.net メンバーシップ システムを使用してきめ細かいアクション コントロールを実現する方法です。

これにより、ビジネス ユニットとして、ユーザーにどのような細かい役割を与えることができるかを知ることが難しくなります。

これが私の新しいアプローチであり、私の提案を実装する前に、誰かがフィードバックやコードレビューを提供できるかどうかを確認したかった.

1) aspnet_roles - ビジネス ユニットの役割

2) 権限テーブルと Role_Permission テーブルと User_Permission テーブル (多対多) を作成して、asp.net メンバーシップ システムを拡張します。

3) 新しいテーブルを参照するカスタム CodeAccessSecurityAttribute + を作成します [CustomPermissionCheck(Security.Demand, HasPermission="can*")] 最初の反復では、依存リポジトリを静的に新しくします。 IPermissionRepository.HasPermission(...);

私が新しい aop の方法にアプローチする場合、おそらく CodeAccessSecurityAttribute からの継承をやめるでしょう - セキュリティ担当者はこれについて何を言わなければなりませんか?

他の誰かがこれを解決しましたか、私が見逃したフレームワークに何かありますか?

4

2 に答える 2

0

最初の反復を実装しましたが、うまく機能しています。[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));
            }
        }
    }
}
于 2011-05-15T04:53:57.263 に答える
0

ASP.NET を使用している場合は、カスタム RoleProviderを実装する必要があります。

カスタム RoleProvider では、ビジネス グループが細かい権限にリンクされている別のテーブルにアクセスします。

次に、ユーザーを見つけたら、そのユーザーが属するビジネス グループを見つけて、RoleProvider で適切なロールをすべて割り当てることができます。既存のコードを変更する必要はありません。

また、コード側でパーミッションのドメイン モデルを純粋に保ちながら、どのグループがどのパーミッションを持つかを簡単に変更できるため、より適切に機能します。

于 2010-05-03T18:51:08.167 に答える