Авторизация услуг с AAD - PullRequest
0 голосов
/ 09 мая 2018

У меня есть пара API («Группа A и B»), которые вызывают один центральный API («API X»). Все используют аутентификацию через Azure AD.

В «API X» я хочу ограничить пару маршрутов подмножеством доступных маршрутов.

/api/stuffForEveryOne/...    <-- Group A and B should be able to call this
/api/specialStuff/...        <-- Only Group B should be able to call this

Как правильно реализовать это?

Моя идея состояла в том, чтобы назначить приложения AAD группам AAD и выполнить проверку путем запроса API-интерфейса графа в «API X». Но поскольку в этом контексте нет пользователей, я не уверен, что это правильный путь. В идеале было бы замечательно, если бы «Группа B» получила дополнительное требование, когда они запрашивают токен JWT для «API X». Но я не знаю, возможно ли это. «Группа А» не должна иметь возможности получить это требование.

1 Ответ

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

Использовать разрешения приложения:)

Вы можете определить два разрешения приложения в манифесте API X, как показано ниже (пример показывает одно, для ясности удалены другие свойства):

{
  "appRoles": [
  {
    "allowedMemberTypes": [
      "Application"
    ],
    "displayName": "Read all todo items",
    "id": "f8d39977-e31e-460b-b92c-9bef51d14f98",
    "isEnabled": true,
    "description": "Allow the application to read all todo items as itself.",
    "value": "Todo.Read.All"
  }
  ]
}

Установите value на то, что имеет смысл для вас, оно будет включено в токен доступа.

Пример токена (с большинством удаленных претензий):

{
  "appid": "28d6c0d7-6017-42f7-8cee-c27d80bb9709",
  "roles": [
    "Todo.Read.All"
  ]
}

Подробнее о них вы можете прочитать в моем блоге: https://joonasw.net/view/defining-permissions-and-roles-in-aad.

Затем вы переходите к обоим приложениям, использующим API X в AAD, и вам требуются оба разрешения для приложения в одном из них и только одно из разрешений в другом. Не забудьте предоставить разрешения.

Затем вы можете добавить политики авторизации, которые требуют наличия заявки с типом "roles" / ClaimTypes.Role (я забыл, какая она есть) и значением значения в разрешении приложения.

Пример определения политики:

services.AddAuthorization(o =>
{
    o.AddPolicy("SpecialStuff", p => p.RequireClaim(ClaimTypes.Role, "SpecialStuff.Read"));
});

Затем вы указываете [Authorize("PolicyName")] на контроллере или действии, для которого вы хотите получить разрешение.

Примечание: мне действительно нужно написать блог о том, как делать это в ASP.NET Core APIs.

...