【问题标题】:Render item based on roles assigned to another controller/action根据分配给另一个控制器/动作的角色渲染项目
【发布时间】:2018-06-01 21:39:37
【问题描述】:

在 Windows 上的 ASP.NET Core 2 中,在控制器 1 的视图中,我有许多链接指向控制器 2 的操作。这些操作使用 Authorize 属性进行了注释。例如:

[Authorize(Roles = @"Domain\Group1, Domain\Group1")]
[Authorize(Roles = @"Domain\User1")]
public IActionResult DisplaySomething()
{
    return View();
}

如果当前用户无权访问该控制器/操作,我不想创建/呈现链接。那么从控制器 1 的角度来看,如何检查用户是否有权调用控制器 2 的操作?

【问题讨论】:

    标签: asp.net-core


    【解决方案1】:

    以最原始的方式将以下内容放在视图中。

    @if (User.IsInRole("Domain\Group1"))
    {
        <div>Only visible for Domain\Group1 users</div>
    }
    

    最好用这个HtmlHelper

    为防止角色名在整个应用程序中分布,您可以使用policies

    您可以在操作方法上指定策略名称,而不是您的角色,以配置对该方法的访问。

    [Authorize(Policy = "MyPolicy")]
    public IActionResult DisplaySomething()
    {
        return View();
    }
    

    在视图中,您决定是否通过检查此策略名称来呈现某些内容。

    @if ((await AuthorizationService.AuthorizeAsync(User, "MyPolicy")).Succeeded)
    {
        <div>Only visible for users matching the rules defined in policy MyPolicy</div>
    }
    

    ConfigureServices 中指定例如。应在给定策略中检查哪些角色。

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthorization(options => {
    
            options.AddPolicy("MyPolicy", policy => {
            policy.RequireAuthenticatedUser();
            policy.RequireRole("Domain\Group1");
            // ...
            });
    }
    

    【讨论】:

    • 谢谢。很高兴了解政策!但是,首先,我试图避免将角色或策略名称硬编码到视图中,因为当它们在控制器/动作装饰中发生变化时它们可能会不同步。其次,角色可能在控制器上的 AND 或 OR 配置中,视图逻辑不应该知道。我想我正在寻找一个可以从如下视图调用的函数: bool IsAuthorized(User user, string controller, string action) 也许有办法通过反射来做到这一点?
    • 我完全同意,看看 HtmlHelpers 或 TagHelpers;你可以写一个可以在你的视图中使用的,例如。 @html.IsUserAnAdmin();被 AND/OR'ed 的组(或策略)的名称进入该函数。你可以随意写这些,它们只是函数。
    猜你喜欢
    • 2011-06-02
    • 2011-08-28
    • 1970-01-01
    • 1970-01-01
    • 2014-09-20
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 2016-02-03
    相关资源
    最近更新 更多