<AuthorizeView Roles =“ ....”>使用我自己的角色而不是Active Directory组?

时间:2019-10-23 21:58:00

标签: asp.net asp.net-core blazor

我知道以下剃刀代码可用于广告组。

<AuthorizeView  Roles="AD_Group1, AD_Group2">

</AuthorizeView>

但是,我将需要从json文件授予权限。在json文件中,它定义了

{
  "WindowsUserName1" : [ "My own group 1", "My own group 2" ],
  "WindowsUserName2" : [ "My own group 2", "My own group 3" ],
  ....
}

如何让<AuthorizeView>用于自定义分组?

2 个答案:

答案 0 :(得分:1)

您没有提到使用的是Blazor WebAssembly还是Blazor服务器。这种区别很重要,尤其是在涉及身份验证时。但是,我猜您正在使用Blazor Server,因为在我看来您正在使用WindowsAuthentication,对吗?

以下是执行此操作的步骤:

  1. 创建一个从AuthenticationStateProvider派生的类,并覆盖其GetAuthenticationStateAsyn方法。在这种方法中,您应该阅读JSON文件的内容,进行所需的任何验证,然后返回Task<AuthenticationState>。 AuthenticationState构造函数获取一个ClaimsPrincipal对象,该对象应包含您可能为选定用户创建的所有声明。

  2. CascadingAuthenticationState组件和AutherizeRouteView都调用GetAuthenticationStateAsyn方法,并将AutheticationState层叠到子组件。 AutherizeView具有此属性:

    [CascadingParameter]私有任务AuthenticationState {get;组; }

哪个是在AutherizeViewCore中定义的,所以如果希望获取AuthenticationState对象,则必须用CascadingAuthenticationState组件包装UI。建议使用CascadingAuthenticationState组件包装App Router组件,以使AuthenticationState完全可通过您的应用程序使用,如下所示:

<CascadingAuthenticationState>
    <Router AppAssembly="typeof(Program).Assembly" Context="routeData">

    </Router>
</CascadingAuthenticationState>

您是否要使用AutherizeView通过“登录”启用类似条形的UI,请执行以下操作:注销用户按钮,用户名标签和图标?如果没有,则不应使用AutherizeView组件...

希望这对您有帮助...

答案 1 :(得分:1)

您可以定义自定义策略来为用户组创建授权规则:

构建自定义要求:

public class UserGroupsRequirement : IAuthorizationRequirement
{
    public string[] Groups { get; }

    public UserGroupsRequirement(string[] groups)
    {
        Groups = groups;
    }
}

创建需求处理程序。这需要从AuthorizationHandler<T>继承,其中T是要处理的要求:

public class UserGroupsHandler : AuthorizationHandler<UserGroupsRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, UserGroupsRequirement requirement)
    {

        var username = context.User.Claims.FirstOrDefault(c=>c.Type==ClaimTypes.Name).Value;

        var groups = requirement.Groups;

        //read json file and find user's groups and check whether groups inlcude in required groups.

        if (true)
        {
             context.Succeed(requirement);
        }

        return Task.CompletedTask;
    }
}

注册策略:

services.AddAuthorization(config =>
{
    config.AddPolicy("UserInGroupsAdmin", policy =>
        policy.Requirements.Add(new UserGroupsRequirement(new string[] { "group1"})));
});

services.AddSingleton<IAuthorizationHandler, UserGroupsHandler>();

然后您可以更新AuthorizeView组件以使用策略:

<AuthorizeView  Policy="UserInGroupsAdmin">
    <p>You can only see this if you're an admin or superuser.</p>
</AuthorizeView>