Атрибут авторизации в контроллере ядра dot net, защищенном oidc

У меня есть приложение MVC dot Net Core 2.0. Приложение проверяет подлинность на IdentityServer4 с использованием гибридного гранта, поэтому у меня есть:

services.AddAuthentication(o =>
{
o.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
o.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
o.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{......

и это прекрасно работает.

У меня также есть клиент JavaScript, который аутентифицируется по тому же IDP, используя неявное предоставление, и который также отлично работает. Я хотел разрешить клиенту javascript, вызывающему API (контроллер внутри приложения MVC), передавать токен-носитель. Если этот API имеет атрибут авторизации, я получаю: Не удалось загрузить http://localhost:4444/testidentity: На запрошенном ресурсе отсутствует заголовок Access-Control-Allow-Origin. Origin 'http://localhost:5003 У меня есть CORS, и вызов работает, если мне не требуется авторизация на уровень контроллера API.

Я могу легко перенести API в отдельный проект и иметь в API что-то вроде:

services.AddAuthentication("Bearer")
.AddIdentityServerAuthentication(options =>
{.......

Это сработает, но я хотел бы, чтобы он работал в приложении MVC и, по-видимому, не хватало какой-то конфигурации промежуточного программного обеспечения.


person user2159200    schedule 24.05.2018    source источник
comment
Стоит публиковать заголовки запроса / ответа, потому что неясно, правильно ли настроен ваш CORS.   -  person sr9yar    schedule 24.05.2018


Ответы (2)


Похоже, вы отправляете HttpRequest в другой домен, чем ваша страница. Таким образом, браузер блокирует его, поскольку обычно он разрешает запрос в том же источнике по соображениям безопасности. Если вы хотите выполнить междоменный запрос, вам нужно сделать что-то другое. Учебное пособие о том, как этого добиться, - это Использование CORS .

Цитата из Cross-Origin XMLHttpRequest:

Обычные веб-страницы могут использовать объект XMLHttpRequest для отправки и получения данных с удаленных серверов, но они ограничены одной и той же политикой происхождения. Расширения не так уж ограничены. Расширение может взаимодействовать с удаленными серверами за пределами своего источника, если оно сначала запрашивает разрешения для разных источников.

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

person DaImTo    schedule 24.05.2018

Я предполагаю, что ваше приложение MVC использует аутентификацию openid bearer и cookie, убедитесь, что схема аутентификации API (контроллер в приложении MVC) указана как "bearer", тогда оно будет искать токен-носитель в запросе (независимо от того, чей вызов API передает ваш CORS политика, определенная для вашего приложения) и проверяет в соответствии с вашей конфигурацией промежуточного программного обеспечения для проверки токена-носителя.

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

Думаю, вам понадобится что-то вроде ниже

[Authorize(AuthenticationSchemes = 
    JwtBearerDefaults.AuthenticationScheme)]

Для получения дополнительной информации см. это

person Jay    schedule 24.05.2018