Смешанная аутентификация и единый вход с помощью Azure Active Directory и ASP.NET Ядро

#asp.net-core #azure-active-directory #single-sign-on #asp.net-core-webapi #microsoft-identity-web

#asp.net-ядро #azure-active-directory #единый вход #asp.net-core-webapi #microsoft-identity-web

Вопрос:

Я работаю над существующим ASP.NET Ядро 3.1 веб-API. Существующая схема аутентификации — JWT. Существует новое требование, согласно которому мы должны поддерживать единый вход с использованием Azure Active Directory.

Итак, я подумал, что стратегия, которой я хочу следовать, заключается в аутентификации пользователя в Microsoft, и когда будет вызван мой обратный вызов URL-адреса входа-oidc, я буду использовать токен от Microsoft для сопоставления с пользователем моего приложения. Затем я создам свой существующий JWT точно так же, как это уже делает приложение, чтобы разрешить дальнейшие действия. Поэтому я хочу пройти аутентификацию в Microsoft, но затем продолжить использовать старую схему авторизации.

И теперь проблема. Насколько я понимаю, URL-адрес входа в oidc — это не то, что вы определяете сами, а скорее скрыто где-то внутри Microsoft.Identity.Web .

Тем не менее, основываясь на приведенном выше описании, я пришел к выводу, что я должен его определить. Итак, каков правильный способ его реализации? Моя реализация ниже работает, но что-то подсказывает мне, что я упускаю что-то важное для безопасности.

 [HttpPost("signin-oidc")]
[AllowAnonymous]
[RequireHttps]
public IActionResult AuthorizeAzureAD([FromForm] OIDCForm form)
{
    var jwtHandler = new JwtSecurityTokenHandler();
    var token = jwtHandler.ReadJwtToken(form.id_token);
    var claims = token.Claims.ToArray();

    // Use the nonce claim to make sure that this callback is initiated by me.
    var guidClaim = claims.FirstOrDefault(c => c.Type == "nonce");

    if (guidClaim == null || !_azureGuids.TryRemove(guidClaim.Value, out string guid))
        return Unauthorized();

    return Ok(/* return the old JWT to the application for further communication. */);
}
 

Спасибо.

Ответ №1:

В качестве обходного пути вы можете использовать OpenID connect для единого входа

Вот несколько документов, в которых описывается, как добавить единый вход в опубликованное веб-приложение в Azure с помощью OpenID Connect. Вы можете точно следовать инструкциям и создать их демо-версию, чтобы протестировать ее, или следовать инструкциям внизу, которые показывают, как реализовать единый вход в вашем собственном приложении.

https://github.com/Azure-Samples/active-directory-dotnet-webapp-openidconnect

Для получения более подробной информации обратитесь к этим документам:

1) https://midnightprogrammer.net/post/single-sign-on-in-aspnet-core-with-azure-active-directory /

2) https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-v2-aspnet-core-webapp

Комментарии:

1. Спасибо. Я видел это, но они сильно отличаются от моего сценария.

2. любое решение этого … я тоже ищу ту же проблему