3

次のコントローラーが与えられた場合

namespace MyNamespace.Api.Controllers
{
    [Authorize]
    public class AccountController : ODataController
    {
        private Entities db = new Entities();

        // GET odata/Account
        [Queryable]
        [ClaimsPrincipalPermission(SecurityAction.Demand, Operation = "Read", Resource = "Account")]
        public IQueryable<Account> GetAccount()
        {
            return db.Accounts();
        }

        ...

    }

}

私はClaimsAuthorizationManager.CheckAccess(...)

public class AuthorizationManager : ClaimsAuthorizationManager
{
    public override bool CheckAccess(AuthorizationContext context)
    {
        var resource = context.Resource.First().Value;
        var action = context.Action.First().Value;

        return Policies.Validate(resource, action);
    }
}

Current Principal これは、が一般的にできるかどうかを確認できる点でのみ役立ちますRead Account。ただし、特定のユーザーが読み取りを許可されているアカウントを確認したい場合は、道に迷ってしまいます。

マネージャーであるすべてのアカウントを読み取ることができるマネージャー ユーザーがいるのに対し、マネージャー以外のユーザーは自分のアカウントのみを読み取ることができるとします。

これに関するベスト プラクティスはありますか、それとも以前にこのようなことをしたことがありますか?探すためのヒントをいくつか教えてください。

4

1 に答える 1

3

ClaimsPrincipalPermissionAttributeサンプルから要求されたアカウントのように、動的パラメーターを渡すことができないため、使用しません。

ブック「Pro APS.NET Web API Security」ページ 97 を参照してください。彼らは、コントローラ アクションの実装からコードで AuthorizationManager を呼び出すことを提案していnew IdentityConfiguration().ClaimsAuthorizationManager.CheckAccess(context)ます。実装。contextAccountResourceAuthorizationManager

また、pluralsight トレーニング「Introduction to Identity and Access Control in .NET 4.5」も参照してください。Web API でクレームベースのセキュリティを実装する方法に関する情報もあります。

現在、私はあなたが話しているセキュリティの実装を進めており、この件にも興味があります。

私の場合: ロール管理者は国によって割り当てられ、すべての管理者はアクセスできる国に関連するエンティティのみを表示できます。

更新: いくつかのプロジェクトの後、クレームベースのセキュリティを忘れていました。これは、セキュリティ チェックを行うのが非常に難しい方法だからです。今日は、すべてのセキュリティ チェックが行われるデコレータ パターンを使用します。次のような OData コントローラーでも、セキュリティを実装するのは非常に簡単なようです。 public IQueriable MyQuriableEntitySet { get{ return implementationWithoutSecurity.MyQuriableEntitySet.Where(e=>e.Country.Code = currentUser.AssignedTo.CountryCode || currentUser.IsSuperAdmin); } }

于 2014-01-23T13:23:13.903 に答える