Azure AD защищено. Net Core Web API 3.1 из Angular Frontend возвращает 401 с MSAL - PullRequest
0 голосов
/ 25 марта 2020

Я пытаюсь получить доступ к защищенному . net core 3.1 Web API через Angular 9 интерфейс . Я использовал пример кода Angular 9 из MSAL Angular репо .

. Я могу успешно войти в систему, используя свои собственные регистрации приложений Azure AD, но при вызове моей конечной точки ( украшенный [Authorize]), я получаю 401 в своем интерфейсе, а также в почтальоне (ожидается).

My Angular Interceptor даже не добавляет токен-носитель в запросе к API, потому что getScopesForEndpoint () возвращает null для запроса:

let scopes = this.auth.getScopesForEndpoint(req.url);
console.log(scopes); 
// scopes is null here.

Если я жестко закодирую области видимости в перехватчике следующим образом:

scopes = [
    "user.read",
    "openid",
    "profile",
    "api://[My API ID]/weatherforecast"
];

Я получаю эту ошибку:

InteractionRequiredAuthError: AADSTS65001: The user or administrator has not consented to use the 
application with ID '[MY APP CLIENT ID]' named '[MY APP]'. Send an interactive 
authorization request for this user and resource.

Я следовал этому уроку здесь: Урок , и я настроил Azure AD, чтобы он был очень похож на это. Единственным существенным изменением было то, что я разрешил MutiTenant вместо SingleTenant:

Azure1

Мое приложение Angular, похоже, не зарегистрировано через API, в соответствии с ошибкой, но я подумал, что это то, что было в Azure AD:

azure2

Я пропустил шаг, позволяющий моему приложению позвонить авторизованной конечной точке моего API? Вот пост, очень похожий на настройку, за которой я следовал Related SO Post . Единственное отличие состоит в том, что мой веб-API находится на https://localhost:44381/weatherforecast вместо развертывания на Azure. Принятый ответ, кажется, не помогает с моим сценарием. Также еще один очень похожий пост здесь: Связанный SO Post 2 , но ответ говорит о проблеме Cors, которая не имеет отношения к делу.

1 Ответ

1 голос
/ 26 марта 2020

В вашем внешнем приложении AD вам нужно добавить Delegated permission вместо Application permission.

Если вы не определили делегированное разрешение для своего приложения Web API, перейдите к нему в portal -> Expose an API -> Add a scope, перейдите по этой ссылке , чтобы открыть делегированное разрешение API.

enter image description here

Затем в своем внешнем приложении AD добавьте делегированное разрешение.

enter image description here

После добавления разрешения нажмите кнопку Grant admin consent for xxx, это означает, что администратор согласие на получение разрешения для пользователя только в вашем AAD-клиенте.

Примечание : если ваше приложение является мультитенантным приложением, а пользователь, который входит в приложение, принадлежит другому арендатору AAD, ему нужен администратор этого согласия арендатора, просто позвольте глобальному администратору этого арендатора войти в приложение, дайте согласие на разрешение. После согласия другие пользователи этого арендатора также смогут войти в систему.

В вашем коде authority должно быть https://login.microsoftonline.com/common, затем в scopes запроса необходимо включите делегированное разрешение scopes: ["<Application ID URI>/<Scope name>"], в моем примере это scopes: ["api://xxxxxxx/Test.test"].

...