использовать мои собственные роли вместо групп Active Directory? - PullRequest
0 голосов
/ 24 октября 2019

Я знаю, что следующий код бритвы работает для групп AD.

<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 ]

1 голос
/ 24 октября 2019

Вы можете определить пользовательскую политику для создания правил авторизации для групп пользователей:

Создание настраиваемого требования:

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>
1 голос
/ 24 октября 2019

Вы не упомянули, используете ли вы Blazor WebAssembly или Blazor Server. Это различие важно, особенно когда задействована аутентификация. Тем не менее, я предполагаю, что вы используете Blazor Server, как мне кажется, что вы используете WindowsAuthentication, верно?

Ниже приведены шаги, чтобы сделать это:

  1. Создайте класс, производный от AuthenticationStateProvider, и переопределите его метод GetAuthenticationStateAsyn. В этом методе вы должны прочитать содержимое файла JSON, выполнить любую необходимую проверку и затем вернуть Task<AuthenticationState>. Конструктор AuthenticationState получает объект ClaimsPrincipal, который должен содержать все утверждения, которые вы можете создать для выбранных пользователей.

  2. Метод GetAuthenticationStateAsyn вызывается как компонентом CascadingAuthenticationState, так и AutherizeRouteView, и оба каскадно связывают AutheticationState с дочерними компонентами. AutherizeView имеет это свойство:

    [CascadingParameter] private Task AuthenticationState {get;установлен;}

Определяется в AutherizeViewCore, поэтому вы должны обернуть свой пользовательский интерфейс компонентом CascadingAuthenticationState, если вы хотите получить объект AuthenticationState. Желательно обернуть компонент «Маршрутизатор приложения» компонентом CascadingAuthenticationState, чтобы AuthenticationState был полностью доступен через ваше приложение, например:

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

    </Router>
</CascadingAuthenticationState>

Собираетесь ли вы использовать AutherizeView для включения пользовательского интерфейса в виде панели? Вход в систему Выйти из кнопок пользователя, метка имени пользователя и значок? Если нет, вам не следует использовать компонент AutherizeView ...

Надеюсь, это поможет ...

...