【问题标题】:How can I get the list of policies from Asp.Net Core Authentication?如何从 Asp.Net Core Authentication 中获取策略列表?
【发布时间】:2017-08-06 07:25:48
【问题描述】:

我正在使用 Asp.Net Core 1.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 async Task<IActionResult> AssignClaimstoAdminRole()
    {
        await _roleManager.AddClaimAsync(await _roleManager.FindByNameAsync("Administrator"), new Claim("AllowInsert", "true"));
        await _roleManager.AddClaimAsync(await _roleManager.FindByNameAsync("Administrator"), new Claim("AllowUpdate", "true"));
        await _roleManager.AddClaimAsync(await _roleManager.FindByNameAsync("Administrator"), new Claim("AllowDelete", "true"));

        await _loginManager.RefreshSignInAsync(await _userManager.FindByNameAsync(User.Identity.Name));
        return RedirectToAction("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>
}

我的问题是: 我想检索在 startup.cs 中创建的策略的列表,以便最终我可以构建一个页面来添加其他用户/角色,为他们分配系统中已经存在的一个或多个策略。

是否有一个对象可以公开先前添加的策略集合? 提前致谢!

【问题讨论】:

    标签: asp.net authentication authorization


    【解决方案1】:

    最好依靠声明。您始终可以访问声明列表。

    我目前正在处理这个问题,应用程序的控制器使用策略来授予访问权限,而我的菜单构建器使用声明来添加或跳过菜单项。

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

    我也发现了一篇有趣的文章,关于复杂的过滤、政策和声明:https://andrewlock.net/custom-authorisation-policies-and-requirements-in-asp-net-core/

    【讨论】:

    • 谢谢芭芭拉。我已经阅读了您建议的精彩文章,实际上它是我结构的基础,但可能我还没有完全理解此身份验证模式背后的概念。我认为“政策”的级别高于“索赔”,因为AuthorizationService.AuthorizeAsync(User, "Insert") 检查政策,而不是索赔。但我无法检索AddPolicy 创建的策略列表。
    【解决方案2】:

    您可以从 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();
    

    【讨论】:

    • 谢谢贝内迪克特!我已尝试实施您的解决方案,但没有成功。 var policies = _actionDescriptorCollectionProvider.ActionDescriptors.Items .SelectMany(actionDescriptor =&gt; actionDescriptor.FilterDescriptors.SelectMany(filter =&gt; (filter.Filter as AuthorizeFilter)?.AuthorizeData?.Select(authData =&gt; authData.Policy) ?? new string[0])) .Where(policy =&gt; !string.IsNullOrEmpty(policy)) .Distinct(); 即使存在并正确检索了策略,结果也始终为空字符串。不知道为什么!
    • 我想我发现了问题:我们已经覆盖了 AuthorizationPolicyProvider 并动态创建了策略(请参阅jerriepelser.com/blog/…)。当你这样做时,我的代码 sn-p 工作。但是,如果您静态定义策略(AuthorizationOptions 上的 AddPolicy),则只存储策略要求,而不存储名称。
    • 我不知道它是否有效,但您可以尝试编写一个 asp net core mvc 约定(参见stevejgordon.co.uk/… 示例)。也许可以在那里提取策略名称。
    猜你喜欢
    • 2022-10-30
    • 1970-01-01
    • 2020-10-10
    • 2017-02-11
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    相关资源
    最近更新 更多