2

私は C# を 1 か月間使用しているので、この質問に対する「ローカル性」を許してください。しかし、数時間調査したところ、レンガの壁にぶつかりました。

とを使用する WPF アプリケーションの役割ベースの承認の例を左右に見てきました。IIdentityIPrincipal

多くの情報を見つけることができませんが、より多くのアクセス許可ベースの承認アプローチについては、このアプリではグループがなく、アクセス許可とユーザーのリストだけがあり、誰にでもアクセス許可を割り当てることができると想像してください。

次のことができるようになりたいです。

1) Enabled、ReadOnly、Invisible、Collapsed などの状態のユーザー権限に基づいて UI/要素を制御できる ( https://uiauth.codeplex.com/を参照)
2) クラスで指定できるまたは権限が必要なメソッドレベル ( http://lostechies.com/derickbailey/2011/05/24/dont-do-role-based-authorization-checks-do-activity-based-checks/に似ています)

それ以外の:

[PrincipalPermission(SecurityAction.Demand, Role = "Administrators")]

私は次のようなものが欲しい:

[PrincipalPermission(SecurityAction.Demand, Permission = "Can add users")]

現在、これを行う唯一の方法は、多くの文字列比較を使用ICommandしてメソッドに承認ロジックを利用しCanExecuteて配置し、ユーザーが要求されたアクションを実行するために必要な権限を持っているかどうかを確認することです。

// Employee class
public bool HasRight(SecurityRight right)
{
    return employee.Permissions.Contains(right);
}

// Implementation, check if employee has right to continue
if (employee.HasRight(db.SecurityRights.Single(sr => sr.Description == "Can edit users")))
{
    // Allowed to perform action
}
else
{
    // User does not have right to continue
    throw SecurityException;
}

Enum Flags が探しているものかもしれないと言われました [Flags] Enum Attribute は C# で何を意味しますか?

enum/flag/bits は理解できたと思いますが、実装を完了するには不十分です...

私が持っている場合:

EmployeeModel
EmployeeViewModel
ThingTwoModel
ThingTwoViewModel
MainView

すべてがどこに行き、すべてを結びつける方法がわかりません....これが私がこれまでに持っているものです(これは実際の例ではないことに気づきました...それが私の問題です!):

    [Flags]
    public enum Permissions
    {
        None = 0,
        Create = 1 << 0,
        Read = 1 << 1,
        Update = 1 << 2,
        Delete = 1 << 3,

        User = 1 << 4,
        Group = 1 << 5
    }

    public static void testFlag()
    {
        Permissions p;
        var x = p.HasFlag(Permissions.Update) && p.HasFlag(Permissions.User);
        var desiredPermissions = Permissions.User | Permissions.Read | Permissions.Create;
        if (x & p == desiredPermissions)
        {
            //the user can be created and read by this operator
        }
    }

ご指導ありがとうございました。

4

2 に答える 2

1

最終的な解決策 (.linq):

void Main()
{
    // Permissions definition
    var userCreate = new Authorization<User>(Permissions.Create);
    var userRead = new Authorization<User>(Permissions.Read);

    var carrotCreate = new Authorization<Carrot>(Permissions.Create);
    var carrotRead = new Authorization<Carrot>(Permissions.Read);

    // User
    var user = new User();

    // User has no permissions yet
    if(user.IsAuthorized<User>(Permissions.Create))
        "I can create User".Dump();
    else
        "No creating User for me".Dump();

    // Now user can Create users
    user.Authorizations.Add(userCreate);            
    if(user.IsAuthorized<User>(Permissions.Create))
        "I can create User".Dump();
    else
        "No creating User for me".Dump();

    // User can read carrots
    user.Authorizations.Add(carrotRead);

    if(user.IsAuthorized<Carrot>(Permissions.Create))
        "I can create carrots".Dump();
    else
        "No creating carrots for me".Dump();

    if(user.IsAuthorized<Carrot>(Permissions.Read))
        "I can read carrots".Dump();
    else
        "No reading carrots for me".Dump();

    // User can now create carrots
    user.Authorizations.Add(carrotCreate);
    if(user.IsAuthorized<Carrot>(Permissions.Create))
        "I can create carrots".Dump();
    else
        "No creating carrots for me".Dump();            

}

[Flags]
public enum Permissions : ulong
{
    Create = 1 << 0,
    Read = 1 << 1,
    Update = 1 << 2,
    Delete = 1 << 3
}

public abstract class Auth{

}
public class Authorization<T> : Auth {
    public Authorization(Permissions permissions){ this.Permissions = permissions; }
    public Permissions Permissions {get;set;}
}

public class Carrot{
    public int Id{get; set;}
}

public class User{
    public User(){ Authorizations = new List<Auth>(); }
    public List<Auth> Authorizations{get; set;}
    public bool IsAuthorized<T>(Permissions permission){
        foreach(var auth in Authorizations)
            if(auth is Authorization<T>){
                var a = auth as Authorization<T>;
                if(a.Permissions == permission)
                    return true;
            }

        return false;
    }
}
于 2013-08-22T20:04:50.703 に答える