Я только что проверил. LGTM. Какая роль должна соответствовать? как это разрешено InWeb (ASP.NET Core 2.0)? Я просто использую Authorize attr. обновил вопрос с помощью InWeb auth config.

я есть приложение для веб-API в Azure, ориентированное на Интернет (PubWeb), поэтому оно используется из любого места. И я создал веб-API (опять же, в Azure, назовем его InWeb). И я хочу строгие правила безопасности:

InWeb должен использоваться только PubWeb. Это может включать некоторую сетевую безопасность - это простая часть (в Azure).Чтобы использовать службы InWeb, необходимо как-то авторизовать PubWeb в Azure AD. Сервисные Принципы, сертификаты и т. Д. Приходит на ум. Но я не уверен.

Так что же является лучшим решением для 2?

ОБНОВИТЬ - вот настройка InWeb Core 2.0 Auth:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(sharedOptions =>
    {
        sharedOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
    })
    .AddAzureAdBearer(options => Configuration.Bind("AzureAd", options));

    services.AddMvc(options => { options.InputFormatters.Add(new TextPlainInputFormatter()); });
}

Ответы на вопрос(1)

Решение Вопроса

. Это можно сделать с помощью блейда Azure Active Directory.Регистрация приложений.

Теперь я предполагаю, что вызовы PubWeb не аутентифицируются токенами-носителями Azure AD. Это означает, что ваша единственная возможность - использовать разрешения приложений и учетные данные клиента при вызове InWeb.

Чтобы определить разрешение приложения, вы должны добавить «роль приложения» в манифест InWeb. Вы можете открыть манифест, нажав кнопку «Манифест» на блейде приложения InWeb в Azure AD.

Вот пример роли приложения:

"appRoles": [
{
  "allowedMemberTypes": [
    "Application"
  ],
  "displayName": "Read all things",
  "id": "32028ccd-3212-4f39-3212-beabd6787d81",
  "isEnabled": true,
  "description": "Allow the application to read all things as itself.",
  "value": "Things.Read.All"
}
],

Вы должны сгенерировать для него новый идентификатор и установить отображаемое имя и описание на то, что вы хотите.стоимость это то, что будет присутствовать в токене, когда PubWeb вызывает InWeb.

Теперь вам нужно перейти на блейд PubWeb и перейти к разделу «Необходимые разрешения».

Там вы должны перейти в Add -> Select InWeb -> Отметьте разрешение приложения, которое вы только что определили.

А затем нажмитеПредоставить разрешения, Теперь PubWeb имеет право звонить в InWeb.

Вам также нужно будет сгенерировать ключ / секрет клиента для PubWeb. Это, по сути, его пароль. Вам также понадобится идентификатор клиента / идентификатор приложения PubWeb.

Вам также понадобитсяURI идентификатора приложения InWeb. Вы можете найти его по его свойствам в блейде в Azure AD. Это будетресурс мы получим токен для PubWeb.

Вам также понадобится идентификатор вашей Azure AD. Вы можете найти его в Свойствах основного блейда Azure AD.

Теперь, чтобы получить токен, вам нужно использовать поток предоставления учетных данных клиента OAuth2. Самый простой способ - использовать такую ​​библиотеку, как ADAL:https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-authentication-libraries.

Если вы хотите сделать это вручную, вы можете найти подробную информацию о HTTP-вызове здесь:https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-oauth-service-to-service#service-to-service-access-token-request

Это выглядит примерно так:

POST /contoso.com/oauth2/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded

grant_type=client_credentials&client_id=625bc9f6-3bf6-4b6d-94ba-e97cf07a22de&client_secret=qkDwDJlDfig2IpeuUZYKH1Wb8q1V0ju6sILxQQqhJ+s=&resource=https%3A%2F%2Fservice.contoso.com%2F

Задайте для идентификатора клиента идентификатор клиента PubWeb, а для секрета клиента - секрет клиента PubWeb. Ресурсом должен быть URI идентификатора приложения InWeb.

В ответ вы должны получить токен доступа, который вам нужно будет прикрепить к запросу, который вы делаете в InWeb в качестве заголовка:

Authorization: Bearer access-token-here

Теперь, конечно, InWeb также должен будет аутентифицировать токен. Вот пример приложения .NET (есть примеры и для других):https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-oauth2-appidentity/blob/master/TodoListService/App_Start/Startup.Auth.cs

У этого проекта также есть клиент, вызывающий API с потоком учетных данных клиента:https://github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-oauth2-appidentity/blob/master/TodoListWebApp/Controllers/TodoListController.cs#L95.

Извините за длинный ответ, я хотел бы добавить немного деталей :)

Но не стесняйтесь спрашивать, если у вас есть вопросы о некоторых конкретных частях.

 alvipeo13 нояб. 2017 г., 06:28
Я все настроил и получил токен. Но когда я делаю запрос, я получаю 401 ... Кстати, мое InWeb - это Core 2.0 Web-приложение. Может я что-то там испортил.
 juunas13 нояб. 2017 г., 06:30
Вы можете проверить содержимое токена, например, наjwt.io, Убедитесь, что аудитория (ауд) и роли там правильно.
 alvipeo10 нояб. 2017 г., 14:30
Спасибо! Я делаю это на выходных.
 alvipeo13 нояб. 2017 г., 07:01
Я только что проверил. LGTM. Какая роль должна соответствовать? как это разрешено InWeb (ASP.NET Core 2.0)? Я просто использую Authorize attr. обновил вопрос с помощью InWeb auth config.
 juunas10 нояб. 2017 г., 15:21
Нет проблем :) Я забыл упомянуть, что InWeb должен проверить, что токен действительно содержит значение разрешения приложения. Но сначала вы должны получить все эти настройки. Вы можете задать другой вопрос, если у вас возникли проблемы или связаться со мной в Twitter, или вы можете присоединиться к ASP.NET Core Slack:tattoocoder.com/aspnet-slack-sign-up, У нас есть канал Azure там.

Ваш ответ на вопрос