Проверьте, включен ли анонимный доступ в ASP. NET Core - PullRequest
0 голосов
/ 04 марта 2020

Мне нужен способ проверить, включено ли / отключено "разрешить анонимно" в действии контроллера. Происходит ли это из атрибута контроллера, атрибута действия

[AllowAnonymous]

или он установлен в качестве фильтра в параметрах MvcOptions

. Filters.Add (новый AllowAnonymousFilter ());

Возможно ли это?

Спасибо!

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Кажется, вам нужно проверить, содержит ли контроллер и действие AllowAnonymousAttribute из вашего пользовательского фильтра аутентификации во время запроса. Таким образом, вы можете сделать это следующим образом:

public class CustomAuthorizationFilter : IAsyncAuthorizationFilter
{
    public async Task OnAuthorizationAsync(AuthorizationFilterContext filterContext)
    {
        if (filterContext == null)
        {
            throw new ArgumentNullException(nameof(filterContext));
        }

        bool hasAllowAnonymous = filterContext.ActionDescriptor.EndpointMetadata
                                 .Any(em => em.GetType() == typeof(AllowAnonymousAttribute)); //< -- Here it is

        if (hasAllowAnonymous) return;

        // Do your authorization check here
    }
}
0 голосов
/ 04 марта 2020

Учитывая дополнительную информацию в вашем комментарии. Похоже, это работает так же, как вы должны выполнить сброс пароля.

Для сброса пароля вы включаете в запрос токен одноразового сброса пароля (вместе с паролем / проверенным паролем и т. Д. c.) Я бы явно украсил действие с помощью [AllowAnonymous] и проверил токен в, прежде чем обновлять какие-либо сведения и отменил токен.

В вашем случае я бы сделал то же самое - явно украсил действие с помощью [AllowAnonymous] и подтвердите одноразовый токен. Вашему действию не должно быть важно, был ли фильтр AllowAnonymous применен к действию через атрибут или опции.

ОБНОВЛЕНИЕ Подумайте еще немного, и есть простой способ отключить это на основе конфигурации сборки. Оберните атрибут в директиву препроцессора #if и создайте конфигурацию сборки, которая определяет символ условного соответствия. См. этот ответ для получения подробной информации

#if DISABLE_ALLOW_ANONYOMOUS
    [AllowAnonymous]
#endif
    public IActionResult GetPicture(string token){
        ...

Затем вы можете создать спецификацию теста c версию, в которой AllowAnonymous отключена.

Вы также можете сделать то же самое с MvcOptions:

#if DISABLE_ALLOW_ANONYOMOUS
    opts.Filters.Add(new AllowAnonymousFilter());
#endif
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...