Идентификация ASP.NET в микросервисной архитектуре

Я пытаюсь реализовать веб-приложение с использованием микросервисной архитектуры, разбивая основные компоненты на отдельные веб-серверы. Я реализую сервер аутентификации, используя ASP.NET Identity (только для входа в систему по электронной почте/имени пользователя, без Facebook и т. д.) и «основной» сервер приложений.

Моя текущая задача — выяснить, как сервер приложений распознает, если пользователь вошел в систему через сервер аутентификации. Поскольку сервер аутентификации генерирует токены, которые он использует для проверки личности пользователей, я полагаю, что они где-то хранятся и могут быть запрошены сервером приложений, но я не уверен, как это сделать. В идеале конечные точки WebAPI моих серверов приложений смогут использовать аннотацию [Authorize].

Вопрос. Как один сервер может управлять доступом через отдельный сервер аутентификации с помощью ASP.NET Identity?


person user-8564775    schedule 11.10.2014    source источник


Ответы (1)


Я сделал что-то подобное, выполнив следующие действия (используя аутентификацию cookie):

1 — установить домен cookie в качестве TLD для всех веб-сайтов

Мой Startup.Auth.cs выглядит так:

app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login"),
            Provider = new CookieAuthenticationProvider
            {
                OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
                    validateInterval: TimeSpan.FromMinutes(30),
                    regenerateIdentity: (manager, user) => {
                        var identity = manager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);

                        //some additional claims and stuff specific to my needs
                        return Task.FromResult(identity);
                    })
            },
            CookieDomain = ".example.com"
        });

2 – обновите файл web.config всех веб-сайтов, чтобы использовать один и тот же <machineKey />.

Мой выглядит так:

<machineKey 
    decryption="Auto" 
    decryptionKey="my_key" 
    validation="HMACSHA512"
    validationKey="my_other_key" />

Теперь я могу выполнять операции входа, скажем, на account.example.com и перенаправлять пользователя на site1.example.com, и они будут рассматриваться как аутентифицированные.

person Brendan Green    schedule 11.10.2014
comment
Поскольку API не имеет состояния, он не будет искать файлы cookie, не так ли? Насколько мне известно, он ищет только заголовок аутентификации. Как это будет работать для API? Я планирую сохранить API внутри своего проекта MVC, поэтому API будет находиться по адресу example.com/api, будет ли это работать? - person CularBytes; 26.08.2015
comment
Таким образом, вместо этого вы можете использовать токены на предъявителя. Суть в том, что машинные ключи одинаковы на всех машинах, иначе токен нельзя будет расшифровать. - person Brendan Green; 26.08.2015
comment
Использование файла cookie для проверки подлинности не обязательно обеспечивает сохранение состояния вашего API. Если вы пытаетесь использовать операции без сохранения состояния (например, в REST), использование файла cookie для проверки подлинности ничем не отличается от использования другого заголовка проверки подлинности. Вы можете безопасно использовать cookie (это просто стандартный HTTP-заголовок). - person SandRock; 24.04.2018