.NET8 Auth – какой должна быть архитектура для реального использования?

Я слышал, что для .NET8 Microsoft подарила нам полностью «фиксированную» настройку аутентификации и авторизации.

Теперь, когда я создаю приложение Blazor на основе шаблонов, оно создает целую кучу страниц администрирования пользователей, включая вход в систему и т. д., и есть миграция базы данных, которую вы можете запустить, чтобы создать для нее соответствующую серверную поддержку. И это прекрасно работает: я могу прямо из коробки добавлять пользователей, входить в систему и защищать страницы с помощью флага [Аутентификация].

Первая проблема, с которой я столкнулся, заключается в том, что я не хочу использовать Entity Framework и не хочу использовать MS SQL Server. Но это проблема в другой раз.

Моя более широкая проблема заключается в том, что этот нестандартный интерфейс, представленный в шаблоне проекта Blazor, не пытается реализовать одну из типичных архитектур, где у вас есть приложение Blazor для внешнего интерфейса, база данных для внутреннего интерфейса и API. который находится между получением и ответом на запросы.

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

Но если я использую шаблоны для создания проекта API .NET8, Microsoft будет придерживаться предыдущего метода аутентификации AzureAD (из предыдущих версий .NET) и не будет использовать какие-либо новые элементы удостоверений, которые вы получаете вместе с приложением Blazor.

Хорошо, возможно, я смогу увидеть, что они делают в приложении Blazor, и вместо этого реализовать все это на стороне API. Но теперь я задаюсь вопросом, не иду ли я против течения и делаю что-то, чего Microsoft не собирается делать. По сути, я беспокоюсь, что заблудился в море и делаю что-то не так.

Существует еще одна сложность: даже если я реализую всю эту идентификацию в API, мне все равно нужно будет вернуть какой-то объект идентификации в приложение Blazor, поскольку ему также необходимо знать, в порядке ли вход пользователя и какие роли у них есть. Я могу представить себе несколько способов вызова конечной точки API для входа в систему из приложения Blazor и возврата подходящего объекта идентификации в приложение Blazor. Но как насчет возможности атак через посредников, когда кто-то отправит свой собственный объект идентификации? Защищено ли оно из-за соединения https:// между приложением Blazor и WebAPI?

Вкратце мой вопрос: является ли моя настройка WebAPI для идентификации, возврат объекта идентификации в Blazor типичным решением или я иду по неправильному пути?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
200
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я всегда задавал себе один и тот же вопрос: почему шаблоны и даже документация Microsoft так мало предлагают тем, кто хочет иметь более готовую к использованию систему?

Подход, который я выбрал уже некоторое время, заключается в следующем:

  1. Создайте проект веб-сборки Blazor для пользовательского интерфейса, используя внешний идентификатор Azure Entra (ранее Azure AD B2C) для аутентификации. Я обычно публикую это через Azure CDN.
  2. Создайте приложение-функцию для API и настройте Easy Auth. Самый сложный аспект здесь — настроить Easy Auth для использования с внешним идентификатором Azure Entra (настроить его для Azure Entra просто, но не так просто для внешнего идентификатора Azure Entra).

Предоставление полного объяснения того, как сделать вышеизложенное, выходит за рамки SO-ответа... если вы не можете его найти, я могу попытаться составить сообщение в блоге.

Я надеюсь, что это, по крайней мере, будет полезно и подтолкнет вас в правильном направлении.

ОБНОВЛЕНИЕ: это моя попытка дать дополнительные рекомендации о том, как действовать.

  1. Создайте арендатора внешнего идентификатора Azure Entra: https://learn.microsoft.com/en-us/azure/active-directory-b2c/tutorial-create-tenant
  2. Создайте поток пользователя для входа в систему. Не стесняйтесь также включать процесс регистрации, если ваши требования позволяют это: https://learn.microsoft.com/en-us/azure/active-directory-b2c/tutorial-create-user-flows?pivots =b2c-пользовательский-поток
  3. Необязательно: также рекомендуется добавить пользовательский поток сброса пароля.
  4. Зарегистрируйте приложение в клиенте B2C: https://learn.microsoft.com/en-us/azure/active-directory-b2c/tutorial-register-applications?tabs=app-reg-ga.
  5. Создайте службу приложений для своего API (это может быть функция Azure, размещенная в службе приложений).
  6. Включите встроенную аутентификацию, также известную как Easy Auth, используя опцию «Пользовательский поставщик». Используйте такой URL-адрес, заменив xxxx на имя вашего арендатора B2C, а B2C_1_Signin на имя вашего собственного процесса входа: https://xxxx.b2clogin.com/tfp/xxxx.onmicrosoft.com/B2C_1_Signin/v2. 0/.well-known/openid-configuration
  7. Используйте идентификатор клиента регистрации приложения, созданной на шаге 4.
  8. Теперь вы можете свободно развернуть веб-сборку Blazor в Azure CDN, что я настоятельно рекомендую, несмотря на то, что у него есть свои проблемы с кэшированием и проверкой целостности при публикации новой версии.
  9. Я не уверен насчет интеграции Easy Auth с ASP.NET Core, но в изолированных функциях Azure (рекомендуется) вы получите утверждения OAuth в HttpRequestData, полученном в качестве параметра функции HttpTrigger (req.Identities и req. Заголовки): https://docs.microsoft.com/en-us/azure/app-service/configure-authentication-user-identities
  10. Не забудьте добавить URL-адрес вашего приложения Blazor Web Assembly в список «Разрешенные источники службы приложений» в разделе CORS.

Эту функцию я использую для извлечения всей важной информации в запись, которую мы называем BackendSecurityContext:

public class EasyAuthHeadersAzureFunctionsSecurityContextFactory : IAzureFunctionsSecurityContextFactory
{
    public const string HeaderName_PrincipalID = "x-ms-client-principal-id";
    public const string HeaderName_PrincipalName = "x-ms-client-principal-name";

    public IBackendSecurityContext CreateSecurityContext(IEnumerable<ClaimsIdentity> claimsIdentities, ImmutableDictionaryOfSet<string, string> httpRequestHeaders)
    {
        // Supporting documentation can be found here: https://docs.microsoft.com/en-us/azure/app-service/configure-authentication-user-identities#access-user-claims-in-app-code
        var idStr = httpRequestHeaders[HeaderName_PrincipalID].SingleOrDefault();
        var name = httpRequestHeaders[HeaderName_PrincipalName].SingleOrDefault();

        var result = new BackendSecurityContext(
            idStr is null ? null : Guid.Parse(idStr), // PrincipalID
            name, // PrincipalName
            !string.IsNullOrEmpty(idStr), // IsAuthenticated
            [], // PrincipalClaims
            ImmutableListWithSequenceEquality<string>.Empty // Roles
        );

        return result;
    }
}

Примечание. По моему мнению, все это должно быть описано на одной странице документации Microsoft в качестве комплексного руководства по серьезной/готовой к производству разработке и развертыванию веб-приложения, но я никогда не нашел такой страницы. Если кто-то это сделает, ему следует просто заменить мой ответ ссылкой! :-)

Спасибо за ваш вклад. Я также осознаю, что мой вопрос сложно вписать в критерии приемлемости вопросов StackExchange. Ваше здоровье.

Q'' 30.04.2024 16:37

Я постарался добавить больше деталей. Все еще может быть сложно заставить все это работать, размещая правильные идентификаторы в нужных местах... но, надеюсь, это поможет.

Rodolfo Grave 30.04.2024 18:20

Спасибо! Кажется на мой вопрос нет ни одного ответа, но поскольку Вы дали наиболее полный ответ, я отметил его как ответ. Я постараюсь разобраться с этим в качестве POC и посмотреть, как у меня получится. Ваше здоровье. Я ценю время.

Q'' 01.05.2024 16:36

Я думаю, что половина людей в MS больше не знают, что они делают, постоянная отток пользователей для аутентификации определенно предполагает это! Проблема открыта на github, где есть пример использования OpenIDdict, а также пример использования JWT для внешнего интерфейса с аутентификацией ASP сзади. Хотя это все беспорядок.

В Openiddict есть сообщение в блоге о том, как сделать приложение Blazor аутентифицированным по вашему желанию — с атрибутами авторизации и т. д.

Отлично, я проверю это, спасибо — и приятно знать, что я борюсь с этим не потому, что заблудился, а потому, что в игре есть настоящая проблема.

Q'' 30.04.2024 16:39

Другие вопросы по теме