Атрибут Authorize в основном контроллере dot net защищен oidc - PullRequest
0 голосов
/ 24 мая 2018

У меня есть приложение 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 имеет атрибут Authorize, я получаю: Не удалось загрузить http://localhost:4444/testidentity: Нет заголовка «Access-Control-Allow-Origin» в запрашиваемом ресурсе.Origin 'http://localhost:5003 У меня CORS берет на себя заботу, и вызов работает, если мне не требуется авторизация на уровне контроллера API.

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

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

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

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

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

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

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

[Authorize(AuthenticationSchemes = 
    JwtBearerDefaults.AuthenticationScheme)]

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

0 голосов
/ 24 мая 2018

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

Цитируется из Cross-Origin XMLHttpRequest :

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

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

...