Как добавить несколько политик в действии, используя атрибут Authorize, используя идентичность 2.0? - PullRequest
0 голосов
/ 03 октября 2018

Я тож 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;
            }
            });

И в моем контроллере используется атрибут Autherize, подобный этому.

[Authorize(Policy = "Assets Edit")]

Пожалуйста, затените его заранее, спасибо.

1 Ответ

0 голосов
/ 04 октября 2018

Для нескольких политик вы можете реализовать свой собственный AuthorizeAttribute.

  • MultiplePolicysAuthorizeAttribute

    public class MultiplePolicysAuthorizeAttribute : TypeFilterAttribute
    {
    public MultiplePolicysAuthorizeAttribute(string policys, bool isAnd = false) : base(typeof(MultiplePolicysAuthorizeFilter))
    {
        Arguments = new object[] { policys, isAnd };
    }
    }
    
  • 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;
        }
    }
    }
    
  • требуется только один изполитика

    [MultiplePolicysAuthorize("Assets View;Assets Edit;Assets Delete")]
    
  • требует только все политики

    [MultiplePolicysAuthorize("Assets View;Assets Edit;Assets Delete", true)]
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...