使用ASP.NET核心标识中的"授权"属性检查多个策略之一

Bla*_*ell 4 c# asp.net-identity asp.net-core-mvc asp.net-identity-3 asp.net-core

我在ASP.NET Core应用程序中设置了标准身份验证系统.

用户,角色,RoleClaims(充当权限)

在Startup.cs中,我为每个角色和每个权限创建一个策略.假设这会让我在视图中具有足够的灵活性,可以说我希望此按钮显示用户是否是声明DeleteCustomer的角色的一部分,或者用户是否属于角色超级用户.

如何使用Authorize属性执行OR条件.例如,在我的整个网站中,我希望SuperuserRole Policy拥有对所有内容的完全权限.

通过一个动作方法,让我说我有以下内容:

[授权(Policy ="EditCustomer")]

这将要求已登录的用户被分配到具有声明的角色:Edit.Customer,因为我正在为声明Edit.Customer创建策略.这一切都运行正常,但我怎么说我希望任何具有角色超级用户的用户能够访问EditCustomer操作方法.超级用户在数据库中作为角色,并另外添加为名为RequireSuperUser的策略.

Ric*_*yan 6

您可以在Startup.cs中添加OR条件:

services.AddAuthorization(options => {
    options.AddPolicy("EditCustomer", policy =>
        policy.RequireAssertion(context => 
        context.User.HasClaim(c => (c.Type == "DeleteCustomer" || c.Type == "Superuser"))));
});
Run Code Online (Sandbox Code Playgroud)

我面临着类似的问题,我只希望"John Doe","Jane Doe"用户查看"Ending Contracts"屏幕,或者只有来自"MIS"部门的任何人才能访问同一个屏幕.以下工作对我来说,我声称类型"部门"和"用户名":

services.AddAuthorization(options => {
    options.AddPolicy("EndingContracts", policy =>
        policy.RequireAssertion(context => context.User.HasClaim(c => (c.Type == "department" && c.Value == "MIS" ||
        c.Type == "UserName" && "John Doe, Jane Doe".Contains(c.Value)))));
});
Run Code Online (Sandbox Code Playgroud)