【问题标题】:Can I allow for unauthorized user to have access to controller if the field "allowed" in appsettings.json is true?如果 appsettings.json 中的“允许”字段为真,我可以允许未经授权的用户访问控制器吗?
【发布时间】:2021-01-20 12:24:45
【问题描述】:

正如标题所说,我尝试让控制器区分两种状态。

  1. 如果 appsettings 中的“允许”字段为真,则允许未经授权的用户访问控制器。
  2. 如果“允许”为假,则只允许授权用户访问。

但我并不知道如何使用策略来实施它。 我可以以某种方式将布尔值传递给授权属性吗?

编辑

控制器

[Authorize(Policy ="Unauthenticated")] // to pass here some additional argument 
public string GetController();

【问题讨论】:

    标签: asp.net asp.net-core asp.net-core-2.2


    【解决方案1】:

    在基于Policy的Authorization Handler方法中,可以使用Configuration provider获取allowed的值,然后根据该值进行策略授权或忽略授权。

    例如,基于this article,我创建了一个MinimumAgeHandler:

    public class MinimumAgeHandler : AuthorizationHandler<MinimumAgeRequirement>
    {
        private readonly UserManager<ApplicationUser> _userManager; //used to get the current user information.
    
        private readonly IConfiguration _configuration;
        public MinimumAgeHandler(UserManager<ApplicationUser> manager, IConfiguration configuration)
        {
            _userManager = manager;
            _configuration = configuration;
        }
        protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MinimumAgeRequirement requirement)
        {
    
            if (context.User == null)
            {
                return Task.CompletedTask;
            }
            if (!context.User.HasClaim(c => c.Type == ClaimTypes.Name))
            {
                //TODO: Use the following if targeting a version of
                //.NET Framework older than 4.6:
                //      return Task.FromResult(0);
                return Task.CompletedTask;
            }
    
            //get the Allowed value from the appsettings.json.
            var isAllowed = _configuration["Allowed"];
    
            //
            if (isAllowed != "True")
            {
                //policy authorization handler
                var user = context.User;
                var age = _userManager.GetUserAsync(user).Result.Age;
    
                if (age >= requirement.MinimumAge)
                {
                    context.Succeed(requirement);
                }
            }
            else
            {
                //ignore the policy authorization handler.
                context.Succeed(requirement);
            }
            //TODO: Use the following if targeting a version of
            //.NET Framework older than 4.6:
            //      return Task.FromResult(0);
            return Task.CompletedTask;
        }
    } 
    

    以及最低年龄要求:

    public class MinimumAgeRequirement : IAuthorizationRequirement
    {
        public int MinimumAge { get; }
    
        public MinimumAgeRequirement(int minimumAge)
        {
            MinimumAge = minimumAge;
        }
    }
    

    然后,注册授权:

            services.AddAuthorization(options =>
            {
                options.AddPolicy("AtLeast21", policy =>
                    policy.Requirements.Add(new MinimumAgeRequirement(21)));
            });
    
            services.AddScoped<IAuthorizationHandler, MinimumAgeHandler>();
    

    在 appsettings.json 文件中添加"Allowed": true,

    最后在action方法中添加Authorize属性:

        [Authorize(Policy = "AtLeast21")]
        public IActionResult Index()
        {
        }
    

    使用上面的示例代码,用户登录后,如果AllowedTrue,它将忽略MinimumAge验证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-10
      • 2013-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-25
      • 2019-07-09
      • 2014-06-22
      相关资源
      最近更新 更多