Аутентификация Asp-Net-Core WebApi с использованием Azure ActiveDir oAuth2.0 JWT Token Microsoft Graph - PullRequest
2 голосов
/ 28 июня 2019

Я эмулирую SPA (одностраничное приложение), адаптируя этот шаблон asp-net-core ядра .net (https://github.com/TrilonIO/aspnetcore-Vue-starter/blob/master/content/Vue2Spa.sln)

. Я могу аутентифицировать пользователя, используя MSAL для графа Microsoft.

Как я могу использовать тот же самый токен, который я использовал для графа Microsoft для моего API (тот же проект, CORS не требуется).

Все, что я пытаюсь выполнить, не получается.

Как должен выглядеть StartUp? Я не хочу никакой аутентификации cookie, у меня AccessToken готов передать как токен JWT .?

Я хотел бы использовать [Authorize] в моих контроллерах API.

SPA-> Получает токен (основанный на моем clientId и т. Д.), Передает токен «Bearer eyJ0eXAiO ....» с вызовами AJAX на мои контроллеры API.

Ответы [ 3 ]

0 голосов
/ 28 июня 2019

Я не очень разбираюсь в MSAL по сравнению с ADAL, но считаю, что одним из отличий является конечная точка Azure. Теперь он изменен на версию 2. В соответствии с рекомендацией Microsoft при аутентификации пользователей с помощью Azure AD предлагается использовать неявный поток oauth 2.0. Больше информации можно найти здесь .

Ваши шаги по приобретению токена для Microsoft Graph требуют немного времени на настройку. Вы должны зарегистрировать и свой интерфейс, и API в регистрации приложения Azure. В интерфейсном приложении вы включаете неявный поток, вы даете ему некоторые разрешения для взаимодействия с графиком API. Это необходимо для того, чтобы использовать существующий токен для приобретения другого токена для Microsoft Graph. (И вы можете сделать то же самое для любых других API, например, CRM API, Sharepoint API)

После того, как вы настроили это, все, что вам нужно сделать, это сделать еще один пост-запрос (вы должны включить токен JWT, который вы получили ранее в заголовке запроса) на https://graph.microsoft.com, чтобы получить токен. В зависимости от того, как вы предоставляете разрешения для внешнего интерфейса, токен может использоваться в рамках заданной области, заданной вами при регистрации приложения.

Возможно, вам интересно, зачем использовать неявный поток? Это связано с тем, что каждый раз, когда ваше интерфейсное приложение отправляет запросы к внутреннему API, токен JWT, который вы получили при входе в систему, можно использовать для аутентификации на вашем API. Таким образом, только ваш интерфейс может совершать вызовы к API.

0 голосов
/ 28 июня 2019

Мне удалось сделать это с помощью токена ID, который я создал с помощью библиотеки MSAL.

Javascript : вернуть myMSALObj.loginPopup (requestObj) .then (функция (loginResponse) { loginResponse.Token});

Затем вы можете взять этот токен и передать его API.

в StartUp.cs

       public void ConfigureServices(IServiceCollection services)
       {
       services.AddAuthentication(options =>
       {
       options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
       options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
       }).AddJwtBearer(options =>
       {
       options.Authority = "https://sts.windows.net/tenantId/v2.0";
       options.Audience = clientId;
       options.TokenValidationParameters.ValidateLifetime = true;
       });

       services.AddAuthorization();

       // Add framework services.
       services.AddMvc()
       .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
       }```
0 голосов
/ 28 июня 2019

Вы не сможете использовать токен, полученный для Microsoft Graph API, для вызова вашего API.

Полученный токен действителен для определенного ресурса, который можно определить по значению претензии aud (то есть аудитории). Подробнее о заявке aud и о том, как она указывает предполагаемого получателя для токена, можно узнать здесь - Токены доступа платформы идентификации Microsoft

Если вы расшифруете свой текущий токен на предъявителя, используя https://jwt.ms или https://jwt.io, вы увидите, что у вашего токена для Microsoft Graph API будет аудитория, подобная https://graph.microsoft.com, поэтому она не предназначена для вашего приложения. .

Вам понадобится получить токен явно для вашего API.

Подробные примеры кода можно найти здесь Примеры кода платформы Microsoft Identity Platform (конечная точка версии 2.0) для одностраничных приложений. Взгляните на это, чтобы SPA вызывал свой собственный API - одностраничное приложение JavaScript с бэкэндом ASP.NET, используя msal.js . Этот использует сам клиент для области видимости.

Вот еще один, который (не SPA), но показывает, как определить свои пользовательские области API и затем использовать их от клиента в случае разделения API и клиентских приложений - Вызов веб-API ASP.NET Core из приложение WPF с использованием Azure AD V2 . Вы можете сделать это из раздела Expose an API в разделе регистрации вашего приложения на портале Azure.

...