如何使用身份 2.0 使用授权属性在操作中添加多个策略?

Alo*_*wal 9 c# claims-based-identity asp.net-core

我是身份 2.1.2 和 asp.net core 2.0,我有应用程序声明表,其中包含声明类型和声明值,即资产、资产编辑、资产、资产视图,其中声明类型与不同的声明值相同,我正在创建策略使用对我来说工作正常的声明类型名称不知道如何在一个操作中添加多个策略。下面的代码在启动文件中用于创建策略。

services.AddAuthorization(options =>
{
   var dbContext = SqlServerDbContextOptionsExtensions.UseSqlServer(new DbContextOptionsBuilder<MyDBContext>(),
      Configuration.GetConnectionString("TestIdentityClaimAuth")).Options;

   var dbCon = new MyDBContext(dbContext);
   //Getting the list of application claims.
   var applicationClaims = dbCon.ApplicationClaims.ToList();
   var strClaimValues = string.Empty;
   List<ClaimVM> lstClaimTypeVM = new List<ClaimVM>();
   IEnumerable<string> lstClaimValueVM = null;// new IEnumerable<string>();

   lstClaimTypeVM = (from dbAppClaim
         in dbCon.ApplicationClaims
      select new ClaimVM
      {
         ClaimType = dbAppClaim.ClaimType
      }).Distinct().ToList();

   foreach (ClaimVM objClaimType in lstClaimTypeVM)
   {
      lstClaimValueVM = (from dbClaimValues in dbCon.ApplicationClaims
         where dbClaimValues.ClaimType == objClaimType.ClaimType
         select dbClaimValues.ClaimValue).ToList();

      options.AddPolicy(objClaimType.ClaimType, policy => policy.RequireClaim(objClaimType.ClaimType, lstClaimValueVM));
      lstClaimValueVM = null;
   }
});
Run Code Online (Sandbox Code Playgroud)

在我的控制器中使用像这样的 Autherize 属性。

[Authorize(Policy = "Assets Edit")]
Run Code Online (Sandbox Code Playgroud)

请提前给它遮光,谢谢。

Tao*_*hou 12

对于多个策略,您可以实现自己的AuthorizeAttribute.

  • MultiplePolicysAuthorizeAttribute

    public class MultiplePolicysAuthorizeAttribute : TypeFilterAttribute
    {
         public MultiplePolicysAuthorizeAttribute(string policys, bool isAnd = false) : base(typeof(MultiplePolicysAuthorizeFilter))
         {
             Arguments = new object[] { policys, isAnd };
         }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • MultiplePolicysAuthorizeFilter

    public class MultiplePolicysAuthorizeFilter : IAsyncAuthorizationFilter
    {
        private readonly IAuthorizationService _authorization;
        public string Policys { get; private set; }
        public bool IsAnd { get; private set; }
    
        public MultiplePolicysAuthorizeFilter(string policys, bool isAnd, IAuthorizationService authorization)
        {
           Policys = policys;
           IsAnd = isAnd;
           _authorization = authorization;
        }
    
        public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
        {
            var policys = Policys.Split(";").ToList();
            if (IsAnd)
            {
                foreach (var policy in policys)
                {
                    var authorized = await _authorization.AuthorizeAsync(context.HttpContext.User, policy);
                    if (!authorized.Succeeded)
                    {
                        context.Result = new ForbidResult();
                        return;
                    }
    
                }
             }
             else
             {
                foreach (var policy in policys)
                {
                     var authorized = await _authorization.AuthorizeAsync(context.HttpContext.User, policy);
                     if (authorized.Succeeded)
                     {
                         return;
                     }
    
                }
                context.Result = new ForbidResult();
                return;
            }
         }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 只需要一项政策

    [MultiplePolicysAuthorize("Assets View;Assets Edit;Assets Delete")]
    
    Run Code Online (Sandbox Code Playgroud)
  • 只需要所有的政策

    [MultiplePolicysAuthorize("Assets View;Assets Edit;Assets Delete", true)]
    
    Run Code Online (Sandbox Code Playgroud)

  • 我只是认为微软忘记实现它了。它应该和角色的工作一样。 (3认同)

her*_*ist 11

如果您只是想应用多个策略,您可以这样做:

[Authorize(Policy = "Asset")]
[Authorize(Policy = "Edit")]
public class MyController : Controller {

}
Run Code Online (Sandbox Code Playgroud)

编辑:澄清一下,这是附加的 - 您必须通过这两个政策要求。

  • 我认为值得一提的是,如果这将被解释为 AND 或 OR .. 可能是 AND (​​来自使用 `[Authorize(Role=..)]` 的官方文档)? (5认同)
  • 是的,需要澄清的是,这是附加的 - 您必须通过这两项政策要求。 (3认同)