代码之家  ›  专栏  ›  技术社区  ›  Tom Crosman

AspNet身份要求声明()-如何使用OR?

  •  0
  • Tom Crosman  · 技术社区  · 6 年前

    我有视觉工作室身份的代码

    namespace BlazorBoilerplate.Shared.AuthorizationDefinitions
    {
        public static class Policies
        {
            public const string IsAdmin = "IsAdmin";
            public const string IsUser = "IsUser";
            public const string IsReadOnly = "IsReadOnly";
            public const string IsMyDomain = "IsMyDomain";
    
            public static AuthorizationPolicy IsAdminPolicy()
            {
                return new AuthorizationPolicyBuilder()
                    .RequireAuthenticatedUser()
                    .RequireClaim("IsAdministrator")
                    .Build();
            }
    
            public static AuthorizationPolicy IsUserPolicy()
            {
                return new AuthorizationPolicyBuilder()
                    .RequireAuthenticatedUser()
                    .RequireClaim("IsUser")
                    .Build();
            }
    
            public static AuthorizationPolicy IsReadOnlyPolicy()
            {
                return new AuthorizationPolicyBuilder()
                    .RequireAuthenticatedUser()
                    .RequireClaim("ReadOnly", "true")
                    .Build();
            }
    
            public static AuthorizationPolicy IsMyDomainPolicy()
            {
                return new AuthorizationPolicyBuilder()
                .RequireAuthenticatedUser()
                .AddRequirements(new DomainRequirement("blazorboilerplate.com"))
                .Build();                
            }
        }
    }
    

    其用法如下:

    [Authorize(Policy = Policies.IsAdmin)]
    

    所以很明显,如果有人是管理员,他们应该通过 Policies.IsUser ,但这种设计不适合这种情况。那么,我如何在策略中执行OR语句,或在授权中使用OR语句来接受多个策略中的一个。

    0 回复  |  直到 6 年前
        1
  •  4
  •   GioviQ    5 年前

    您需要使用RequireAssertion

                       case Policies.IsUser:
                            policy = new AuthorizationPolicyBuilder()
                                .RequireAuthenticatedUser()
                                .RequireAssertion(ctx =>
                                ctx.User.HasClaim(claim => claim.Type == "IsUser") ||
                                ctx.User.IsInRole(DefaultRoleNames.Administrator))
                                .Build();