3

私のアプリケーションでは、ロールにはいくつかの権限があります。また、ロールではなく、パーミッションに依存するアクションにユーザーがアクセスできるようにしたいと考えています。

したがって、次のように仮定します。

  • 管理者には、perm1、perm2、perm3、
  • SuperAdmin には、admin が持つすべてのパーミッション + perm4 および perm5 があります。
  • また、パーマ1、パーマ3、パーマ6、パーマ7を持っている未成年の男性もいます。

私は次のことをしたい: perm3 または perm4 を想定している人がアクションにアクセスできるようにしたい。これら 2 つの権限は、2 つの異なる役割からのものです。ただし、perm3 管理者には perm1 と perm2 があります。このアクションは、perm3 を持っている未成年者もアクセスできます (管理者またはスーパー管理者である必要はありません)。

意味が分かりますよね?ASP.NET MVC 4 でこれを実現したいので、自分のAuthorizeAttribute、自分のIIdentityを作成し、global.asax にいくつかのメソッドを記述する必要があると思います。ASP.NET にもメンバーシップがあります。触れる必要がありますか? すべてをまとめる方法がわかりません。誰でも私を助けることができますか?

4

3 に答える 3

1

基本的に、独自の AuthorizeAttribute を作成する必要がありますが、.NET から IIdentity を使用します。ここで説明したのは、認証と承認のためのクレームベースのシステムです。

ほとんどの場合、ASP.NET からメンバーシップを破棄するか、その一部だけを使用する必要があります。私の知る限り、クレームを念頭に置いて構築されていません。

.NET 4.5 では、インターフェイス IPrincipal を実装するクラス ClaimsPrincipal が追加されました。このクラスを使用して、クレームに基づくカスタムの認証と承認を実装できます。

したがって、ユーザーが認証されると、スレッドにクレームを追加できます。

var id = new ClaimsIdentity(claims, "Dummy");
var principal = new ClaimsPrincipal(new[] { id });
Thread.CurrentPrincipal = principal;

その後、Thread.CurrentPrincipal で見つけたクレームを使用します。

ASP.NET MVC では、次の手順を実行できます。

  1. ユーザーを認証する委任ハンドラーを作成します。ユーザーが認証されると、要求がスレッド プリンシパルに追加されます。理想的には、この委任ハンドラーはチェーンのできるだけ上位に配置して、実行チェーンのどこでもクレームを使用できるようにする必要があります。また、同じプリンシパルで HttpContext.Current.User を設定することを忘れないでください

    public class AuthHandler : DelegatingHandler{

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
    //authenticate user
    //get claims
    //create principal
    var newPrincipal = CreatePrincipal(claims);
    Thread.CurrentPrincipal = newPrincipal;
    if (HttpContext.Current != null)
         HttpContext.Current.User = newPrincipal;
    return await base.SendAsync(request, cancellationToken);
    }
    

    }

  2. スレッド プリンシパルに追加されたクレームに基づいて承認するフィルターを作成します。ここでは、現在のルートとクレームに記載されている情報を比較するなどの操作を行うことができます。

于 2013-10-22T09:06:00.720 に答える
0

だから私はあなたが言っていると思います:ユーザーがperm1、perm2を持っている場合にのみActionAにアクセスでき、同様にユーザーがperm1とperm3を持っている場合にActionBにアクセスできます

私が与えたコードは説明用であり、コンパイルしませんでした。しかし、私が述べているアプローチの写真を提供します

ステップ 1: Flags 属性が付与されたパーミッション列挙型の作成に進むことができます

ステップ 2:データ ストアに格納されているユーザーのアクセス許可に基づいて、現在のプリンシパルにクレームを追加します。

ステップ 3:アクションが呼び出されたら、クレームに対してアクセスを許可する

[Flags]
    enum PermType
    {
        None = 0x0,
        Perm1 = 0x1,
        perm2 = 0x2,
        perm3 = 0x4,
        perm4 = 0x8,
        perm5 = 0x10 
    }

CurrentPrincipal へのクレームの追加

var currentPrincipal = ClaimsPrincipal.Current;
var cms = currentPrincipal.Claims;
var permissions = PermType.Perm1 | PermType.perm2;
var claims = cms.ToList();
claims.Add(new Claim("Action1", permissions.ToString()));
claims.Add(new Claim("Action2", permissions.ToString()));
claims.Add(new Claim("Action3", permissions.ToString()));
System.Threading.Thread.CurrentPrincipal = new ClaimsPrincipal(new ClaimsIdentity(claims));

ユーザーが特定のアクションにアクセスできるかどうかを確認します

public bool CanAccessThisAction(string acionName,PermType requiredPerms)
{
    var claim = principal.Claims.FirstOrDefault(c => c.Type == acionName);
    if (customPermissionClaim != null)
    {
        //check if required permission is present in claims for this user
        //return true/false
    }
    return false;
}

オン アクション

public ActionResult TestAction(string id)
{
    if(CanAccessThisAction("TestAction",PermType.Perm1|PermType.perm3|PermType.perm5))
    {
        //do your work here
    }
    else
    {
        //redirect user to some other page which says user is not authorized
    }
}
于 2013-10-22T10:11:22.620 に答える