Как выполнить "авторизацию" проверки подлинности в .NET Core? - PullRequest
0 голосов
/ 05 января 2019

Учтите, что у меня есть .NET Controller с авторизацией на основе политик:

public class ImportantController: Controller {
    [HttpGet]
    [Authorize(Policy = "CanAccessVIPArea")]
    public IActionResult ShowInformation() {
        ...
        return OK(VipData);
    }

    [HttpPost]
    [Authorize(Policy = "CanChangeVIPData")]
    public IActionResult SaveInformation([FromBody] VipData) {
        ...
        return CreatedAtAction(...);
    }
}

Очевидно, реальный пример гораздо сложнее; Я прошу прощения, если мое упрощение приводит к слишком много притворства в этом. Также реальным применением является SPA с угловым передним концом; но я не думаю, что это имеет значение для целей этого вопроса.

Когда пользователь звонит ShowInformation(), я показываю много данных. На этой странице у меня есть кнопка Save, которая вызывает SaveInformation(). Промежуточное ПО авторизации проверяет правильность политики, и все работает нормально.

Проблема в том, что к тому времени, когда пользователь нажимает кнопку Сохранить, она вводит много данных только для того, чтобы выяснить, что у нее нет прав на сохранение. Очевидно, что приводит к плохому опыту. Я хочу проверить разрешения для SaveInformation в промежуточном программном обеспечении, которое вызывается, когда пользователь вызывает ShowInformation . Я бы предпочел не проверять наличие жестко заданной политики, поскольку она находится на сервере и может меняться (у нас довольно сложная система управления разрешениями, которая манипулирует разрешениями во время выполнения). Вызов SaveInformation находится в том же сервисе Angular, что и ShowInformation, и его очень легко проверить ...

Я хотел бы вызвать что-то вроде /api/SaveInformation?dryrun, которое будет закорачивать конвейер после авторизации промежуточного программного обеспечения с успехом или неудачей.

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Вы можете добавить сервис IAuthorizationService и попросить оценить политику по имени:

public class ImportantController: Controller 
{
    private readonly IAuthorizationService authorization;

    public ImportantController(IAuthorizationService authorization)
    {
        this.authorization = authorization;
    }

    public async Task<IActionResult> ShowInformation() 
    {
        // ...
        var result = await authorizationService.AuthorizeAsync(User, "IsLucky"); 

        return OK(VipData);
    }
}
0 голосов
/ 05 января 2019

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

...