AuthorizationPolicy by UserName не найден - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь добавить новую авторизацию на основе политики для определенного пользователя, которому необходимо выполнить определенные действия контроллера, для которого требуются права.Я новичок в авторизации на основе политик, но я следовал всем инструкциям на этом посте и кажется довольно простым.

В моих файлах Startup.cs и после AddMvc () метод, который у меня есть:

services.AddAuthorization(options =>
{
    options.AddPolicy("AgentsActivityReport ", policy => policy.RequireUserName("AnaR"));
}); 

Затем, в моем действии контроллера у меня есть:

[Authorize(Policy = "AgentsActivityReport")]
public ActionResult AgentsActivity()
{
    //some code
}

Однако, когда я запускаю приложение, я получаю следующую ошибку:

InvalidOperationException: AuthorizationPolicy с именем: 'AgentsActivityReport' не найден.

Я также прочитал несколько других тем / сообщений, таких как:

Авторизация на основе утверждений и политик с помощью ASP.NET Core 2.1

сообщается о проблеме

И все кажется в значительной степени правильным.Какие-нибудь мысли?

1 Ответ

0 голосов
/ 18 февраля 2019

Основываясь на этой записи, я смог объявить и разрешить своему пользователю вызывать действие контроллера с использованием требования.Поскольку мое условие должно быть «разрешить определенные роли ИЛИ определенного пользователя с именем AnaR», мне пришлось поместить эту логику в AuthorizationHandler.cs

Startup.cs

services.AddAuthorization(options => {
         options.AddPolicy("ReportActivityPolicy", policy =>
            {
                policy.AddRequirements(new UserNameRequirement("AnaR"));                    
            });
        });

services.AddSingleton<IAuthorizationHandler, AgentsActivityAuthorizationHandler>();

А потом, в отдельном файле:

public class AgentsActivityAuthorizationHandler : AuthorizationHandler<UserNameRequirement>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, UserNameRequirement requirement)
    {
        if (context.User.IsInRole("Administrator") || context.User.IsInRole("Manager") || context.User.Identity.Name == requirement.UserName)
        {
            context.Succeed(requirement);
        }

        return Task.FromResult(0);
    }
}

public class UserNameRequirement : IAuthorizationRequirement
{
    public UserNameRequirement(string username)
    {
        this.UserName = username;
    }

    public string UserName { get; set; }
}

Затем, в моем контроллере, следующее:

[Authorize(Policy = "ReportActivityPolicy")]
public ActionResult AgentsActivity()
{
    //code of your controller.
}

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

...