如何从Asp.Net核心身份验证获取策略列表?

如何从Asp.Net核心身份验证获取策略列表?,asp.net,authentication,authorization,Asp.net,Authentication,Authorization,我正在使用Asp.NETCore1.1.1及其授权/身份验证系统创建一个web应用程序 在我的startup.cs文件中,我配置了所需的各种策略: public void ConfigureServices(IServiceCollection services) { servizi.AddAuthorization(options => { options.AddPolicy("Insert", policyBuilder =>

我正在使用Asp.NETCore1.1.1及其授权/身份验证系统创建一个web应用程序

在我的startup.cs文件中,我配置了所需的各种策略:

public void ConfigureServices(IServiceCollection services)
{
        servizi.AddAuthorization(options =>
        {
            options.AddPolicy("Insert", policyBuilder => policyBuilder .RequireClaim("AllowInsert"));
            options.AddPolicy("Update", policyBuilder => policyBuilder .RequireClaim("AllowUpdate"));
            options.AddPolicy("Delete", policyBuilder => policyBuilder .RequireClaim("AllowDelete"));
        });
}
然后在控制器中,我已将声明分配给一个角色(管理员角色):

public异步任务AssignClaimstoAdminRole()
{
wait_rolemager.addClaimesync(wait_rolemager.findbynamesync(“管理员”)、新声明(“AllowInsert”、“true”);
wait_rolemager.addClaimesync(wait_rolemager.findbynamesync(“管理员”)、新声明(“AllowUpdate”、“true”);
wait_roleManager.addClaimesync(wait_roleManager.findbynamesync(“管理员”)、新声明(“AllowDelete”、“true”);
wait_loginManager.RefreshSignInAsync(wait_userManager.FindByNameAsync(User.Identity.Name));
返回重定向到操作(“SomeAction”、“MyController”);
}
最后,我通过授权服务保护了我的观点:

@using Microsoft.AspNetCore.Authorization
@inject IAuthorizationService AuthorizationService

@if (await AuthorizationService.AuthorizeAsync(User, "Insert"))
{
     <i role="submit" class="fa fa-floppy-o fa-2x"></i>
}
@使用Microsoft.AspNetCore.Authorization
@注入IAuthorizationService授权服务
@if(wait AuthorizationService.authorizationAsync(用户,“插入”))
{
}
我的问题是: 我想检索startup.cs中创建的策略的列表,这样最终我可以创建一个页面来添加其他用户/角色,为他们分配系统中已经存在的一个或多个策略

是否有对象公开以前添加的策略集合?
提前谢谢

最好依靠索赔。您始终可以访问索赔列表

我目前正在做这个,应用程序的控制器使用策略来授予访问权限,我的菜单生成器使用声明来添加或跳过菜单项

我认为我可以对索赔值和保单名称使用相同的字符串,因此更易于管理


我还发现了一篇关于复杂过滤、策略和声明的有趣文章:

您可以从IActionDescriptorCollectionProvider获得它们

var policies = actionDescriptorCollectionProvider.ActionDescriptors.Items
       .SelectMany(actionDescriptor => actionDescriptor.FilterDescriptors.SelectMany(filter => (filter.Filter as AuthorizeFilter)?.AuthorizeData?.Select(authData => authData.Policy) ?? new string[0]))
       .Where(policy => !string.IsNullOrEmpty(policy))
       .Distinct();

谢谢你,芭芭拉。我已经阅读了您建议的那篇伟大的文章,实际上它是我的结构的基础,但是我可能还没有完全理解这个身份验证模式背后的概念。我认为“策略”比“声明”的级别更高,因为
AuthorizationService.authorizationasync(用户,“插入”)
检查策略,而不是声明。但是我无法检索由
AddPolicy
创建的策略列表。谢谢您!我试图实施你的解决方案,但没有成功<代码>var策略=_actionDescriptorCollectionProvider.ActionDescriptors.Items.SelectMany(actionDescriptor=>actionDescriptor.FilterDescriptors.SelectMany(filter=>(filter.filter作为AuthorizeFilter)?.AuthorizeData?选择(authData=>authData.Policy)??新字符串[0])。其中(Policy=>!string.IsNullOrEmpty(Policy)).Distinct()结果始终为空字符串,即使存在并正确检索了策略。不知道为什么!我想我发现了问题:我们已经覆盖了AuthorizationPolicyProvider并动态创建了策略(请参阅)。当您这样做时,我的代码片段就可以工作了。但是如果静态定义策略(在AuthorizationOptions上添加策略),则只存储策略要求,而不存储名称。我不知道它是否有效,但您可以尝试编写asp net core mvc约定(参见示例)。也许可以在那里提取策略名称。
var policies = actionDescriptorCollectionProvider.ActionDescriptors.Items
       .SelectMany(actionDescriptor => actionDescriptor.FilterDescriptors.SelectMany(filter => (filter.Filter as AuthorizeFilter)?.AuthorizeData?.Select(authData => authData.Policy) ?? new string[0]))
       .Where(policy => !string.IsNullOrEmpty(policy))
       .Distinct();