основная авторизация asp.net - обработчик авторизации операций - PullRequest
0 голосов
/ 13 сентября 2018

У меня странная проблема, и я не могу ее отладить.

Я пытаюсь использовать OperationAuthorizationRequirement и AuthorizationHandler.

Когда я помещаю точку останова в контроллер, я всегда получаю 403В результате я попытался установить точку останова внутри CountryControllerAuthorizationHandler, и она никогда не срабатывает.Но в контроллере я всегда получаю результат AuthorizeAsync false, но я не могу понять, почему я не могу получить точку останова, когда ее ударили или сработали.Я делаю какую-то глупую ошибку?Во всяком случае, как я вижу, ресурс NOT null, а также пользователь и утверждения NOT null:

Вот мой код:

CountryControllerAuthorizationHandler:

public class CountryControllerAuthorizationHandler : AuthorizationHandler<OperationAuthorizationRequirement, Country>
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                   OperationAuthorizationRequirement requirement,
                                                   Country resource)
    {
        if (requirement.Name == Operations.ReadDetail.Name &&
            context.User.Claims.FirstOrDefault(a => a.Type == "userType")?.Value == "customer"
            )
        {
            context.Succeed(requirement);
        }

        if (requirement.Name == Operations.Create.Name &&
            context.User.Claims.FirstOrDefault(a => a.Type == "userType")?.Value == "1"
            )
        {
            context.Succeed(requirement);
        }

        if (requirement.Name == Operations.Update.Name &&
            context.User.Claims.FirstOrDefault(a => a.Type == "userType")?.Value == "1"
            )
        {
            context.Succeed(requirement);
        }

        if (requirement.Name == Operations.Delete.Name &&
           context.User.Claims.FirstOrDefault(a => a.Type == "userType")?.Value == "1"
           )
        {
            context.Succeed(requirement);
        }

        return Task.CompletedTask;
    }
}

Операциикласс:

public static class Operations
{
    public static OperationAuthorizationRequirement Create =
        new OperationAuthorizationRequirement { Name = nameof(Create) };
    public static OperationAuthorizationRequirement Read =
        new OperationAuthorizationRequirement { Name = nameof(Read) };
    public static OperationAuthorizationRequirement ReadDetail =
      new OperationAuthorizationRequirement { Name = nameof(ReadDetail) };
    public static OperationAuthorizationRequirement Update =
        new OperationAuthorizationRequirement { Name = nameof(Update) };
    public static OperationAuthorizationRequirement Delete =
        new OperationAuthorizationRequirement { Name = nameof(Delete) };
}

Startup.cs:

services.AddSingleton<IAuthorizationHandler, CountryControllerAuthorizationHandler>();

services.AddMvcCore()
    .AddAuthorization()
    .AddJsonFormatters();

services.AddAuthentication("Bearer")
    .AddIdentityServerAuthentication(options =>
    {
        options.Authority = "http://localhost:5000";
        options.RequireHttpsMetadata = false;
        options.ApiName = "api1";
    });

И, наконец, контроллер:

public CountriesController(ICountryService service, IAuthorizationService authorizationService)
{
    _authorizationService = authorizationService;
    this.countryService = service;
}

public async Task<object> GetDetail()
{
    var obj = countryService.Get_DETAILS();
    var authorizationResult = await _authorizationService.AuthorizeAsync(User, obj, Operations.ReadDetail);

    if (authorizationResult.Succeeded)
    {
        return Ok(obj);
    }
    else if (User.Identity.IsAuthenticated)
    {
        return new ForbidResult();
    }
    else
    {
        return new ChallengeResult();
    }
}

1 Ответ

0 голосов
/ 14 сентября 2018

Убедитесь, что countryService.Get_DETAILS() равно не равно нулю и верните только одну страну .

Для CountryControllerAuthorizationHandler он принимает Country, поэтому передается только один объект округа в HandleRequirementAsync.

HandleRequirementAsync вызывается HandleAsync в AuthorizationHandler.

Попробуйте выполнить тест с кодом ниже, чтобы отладить причину, по которой HandleRequirementAsync не вызывается.

    public class CountryControllerAuthorizationHandler : AuthorizationHandler<OperationAuthorizationRequirement, Country>
{
    public override async Task HandleAsync(AuthorizationHandlerContext context)
    {
        if (context.Resource is Country)
        {
            foreach (var req in context.Requirements.OfType<OperationAuthorizationRequirement>())
            {
                await HandleRequirementAsync(context, req, (Country)context.Resource);
            }
        }
    }
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                   OperationAuthorizationRequirement requirement,
                                                   Country resource)
    {
        if (requirement.Name == Operations.ReadDetail.Name &&
            context.User.Claims.FirstOrDefault(a => a.Type == "userType")?.Value == "customer"
            )
        {
            context.Succeed(requirement);
        }

        if (requirement.Name == Operations.Create.Name &&
            context.User.Claims.FirstOrDefault(a => a.Type == "userType")?.Value == "1"
            )
        {
            context.Succeed(requirement);
        }

        if (requirement.Name == Operations.Update.Name &&
            context.User.Claims.FirstOrDefault(a => a.Type == "userType")?.Value == "1"
            )
        {
            context.Succeed(requirement);
        }

        if (requirement.Name == Operations.Delete.Name &&
           context.User.Claims.FirstOrDefault(a => a.Type == "userType")?.Value == "1"
           )
        {
            context.Succeed(requirement);
        }

        return Task.CompletedTask;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...