Параллелизация аутентификации на основе ролей MVC - PullRequest
0 голосов
/ 09 мая 2018

В MVC Core следующий код показывает, как проводить авторизацию на основе ролей.

Например: люди из отдела кадров и финансов могут получить доступ.

Как настроить параметры ролей ниже для развертывания с переменными без изменения исходного кода? Например, на следующей неделе роли будут заменены на «Бухгалтерский учет» и «Маркетинг».

Чтение статьи MSDN: Авторизация на основе ролей в ASP.NET Core

[Authorize(Roles = "HRManager,Finance")]
public class SalaryController : Controller
{
}

Ответы [ 3 ]

0 голосов
/ 12 мая 2018

Вы должны использовать Policy и написать свой AuthorizationHandler.

Вот пример, как вы можете это сделать:

appsettings.json

{
  "Auth": {
    "Role": "User"
  }
}

startup.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
            .Build();

        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddAuthorization(cfg =>
        {
            cfg.AddPolicy("dynamicRole", b => b.Requirements.Add(new DynamicRole()));
        });

        services.AddScoped<IAuthorizationHandler, DynamicRoleHandler>();
        services.Configure<AuthorizationOptions>(Configuration.GetSection("Auth"));
    }
}

DynamicRole.cs

public class DynamicRole : IAuthorizationRequirement
{
}

AuthorizationOptions.cs

public class AuthorizationOptions
{
    public string Role { get; set; }
}

DynamicRoleHandler.cs

public class DynamicRoleHandler : AuthorizationHandler<DynamicRole>
{
    private readonly AuthorizationOptions _options;

    public DynamicRoleHandler(IOptionsMonitor<AuthorizationOptions> options)
    {
        _options = options.CurrentValue;
    }

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, DynamicRole requirement)
    {
        if (context.User.IsInRole(_options.Role))
        {
            context.Succeed(requirement);
        }
        else
        {
            context.Fail();
        }
        return Task.CompletedTask;
    }
}

TestController.cs

public class TestController : Controller
{

    [Authorize(policy: "dynamicRole")]
    public string Test()
    {
        return "Hello World!";
    }
}
0 голосов
/ 14 мая 2018

Это также вопрос дизайна: если вы думаете о ролях как о группах пользователей, вы в конечном итоге сталкиваетесь с такими ситуациями; при изменении среды (или при ее развертывании в другом месте) вам потребуется изменить настройки авторизации. Но если вы можете иметь иерархические роли, вам это больше не нужно. Позвольте мне объяснить: вы установили роль Salary для SalaryController. В управлении ролями просто добавьте к роли (группе) Зарплата группы HRManager и Finance. И вы можете добавить пользователей к ним позже. Вам никогда не понадобится менять код, чтобы изменить реальных людей, которые могут достичь функции (U = G = F). Просто никогда не добавляйте пользователей напрямую в группу зарплат - это будет работать, но это портит концепцию. Если за управлением ролями нет группы для группового членства, тогда ... ну, тогда вам все равно следует попытаться заменить ее, поскольку она не самая лучшая.

Если у вас есть Active Directory в корпоративной среде (где еще?), Где роли представляют собой группы безопасности AD, вы можете столкнуться с тем фактом, что существуют корпоративные политики, касающиеся именования этих групп. И это будет отличаться от корпоративного к корпоративному. Чтобы справиться с этим, вы все равно должны выбрать имена ролей для выражения функциональности вместо группы пользователей. Но вам нужно будет отобразить между ролью и группой, соответствующей роли (это фактически один слой сверху концепции сверху: U = G = G-F). Таким образом, в вашем коде вы будете использовать названия функций или ролей, которые хотите, но за кулисами все будет переведено в членство в группе AD. Я написал фильтр авторизации, который обрабатывает последний сценарий, и я с радостью поделюсь им с вами, если вам это нужно - вы пометили свой вопрос asp.net-mvc. Для asp.net-core @ Kahbazi ответ - путь (больше здесь ).

0 голосов
/ 12 мая 2018

Не самый красивый способ сделать это xD

[Authorize(Roles = SomeClassName.DynamicRoles)]
public class SalaryController : Controller
{
}

И сделать статический класс как

public static class SomeClassName
{
    public const string DynamicRoles = "HRManager, Finance";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...