Авторизация приложения MVC для ApiController не работает - PullRequest
0 голосов
/ 07 декабря 2018

Я создаю приложение MVC, в котором стандартные контроллеры и контроллеры APIC находятся в одном проекте.Все функции работают нормально, я могу назвать контроллеров или APIControllers без проблем.

Я пытаюсь добиться того, чтобы, если вы звоните / api / products извне, он не был доступен, его могли вызывать только авторизованные пользователи.

Я добавил иАтрибут Authorize для моего контроллера API, и я все еще могу вызывать его и получать результаты из клиентского приложения, такого как Postman.Вы можете увидеть мой код ниже.

 [Authorize] //System.Web.Http
 public class ProductsController : ApiController 

 [HttpGet]
 public IHttpActionResult Get()

Вот что у меня есть в моем файле Startup.Auth.cs.

 app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Account/Login"),
                Provider = new CookieAuthenticationProvider
                {
                    // Enables the application to validate the security stamp when the user logs in.
                    // This is a security feature which is used when you change a password or add an external login to your account.  
                    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                        validateInterval: TimeSpan.FromMinutes(30),
                        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
                }
            });

Если я закомментировал этот код, я получаю правильноеответ от APIController, но я также не могу войти.

<Error>
<Message>Authorization has been denied for this request.</Message>
</Error>

Не уверен, что мне не хватает.Насколько я понимаю, мне не нужно создавать собственный фильтр для моих контроллеров API, я должен иметь возможность использовать встроенную функцию авторизации.Дайте мне знать, если вам нужно больше деталей или примеров кода.

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Интересные выводы.Я попытался вызвать контроллеры API, для которых требуется аутентификация, из приложения без авторизации, и я получил правильный ответ «Не авторизован».Я попытался вызвать конечную точку API с помощью Fiddler, тот же результат.

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

Надеюсь, мой пример сэкономит вам время.

0 голосов
/ 07 декабря 2018

Я думаю, что аутентификация для ваших контроллеров MVC определяется как Startup.Auth.cs, а для контроллеров API - WebApiConfig.cs.

Убедитесь, что на WebApiConfig.cs в методе Register() вы используетевызов config.SuppressDefaultHostAuthentication();, который не позволяет настроенному методу аутентификации на контроллерах MVC работать на вызовах ApiController.

Также обратите внимание, что в некоторых случаях вам необходимо добавить атрибут [AllowAnonymous] в некоторыеAPI-вызовы, такие как логин, регистрация и т. Д.

...