我知道以下剃刀代码可用于广告组。
<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>
用于自定义分组?
答案 0 :(得分:1)
您没有提到使用的是Blazor WebAssembly还是Blazor服务器。这种区别很重要,尤其是在涉及身份验证时。但是,我猜您正在使用Blazor Server,因为在我看来您正在使用WindowsAuthentication,对吗?
以下是执行此操作的步骤:
创建一个从AuthenticationStateProvider派生的类,并覆盖其GetAuthenticationStateAsyn方法。在这种方法中,您应该阅读JSON文件的内容,进行所需的任何验证,然后返回Task<AuthenticationState>
。 AuthenticationState构造函数获取一个ClaimsPrincipal对象,该对象应包含您可能为选定用户创建的所有声明。
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>