IdentityServer4 как бороться с returnUrl - PullRequest
0 голосов
/ 21 апреля 2020

Наш старший разработчик недавно покинул нас, и я пытаюсь уплыть в океан, который является IdentityServer.

Есть несколько вещей, которые я не понимаю и не могу найти информацию о них. Как, например, когда вы запускаете клиентское приложение, оно перенаправляется на IdentityServer/Account/Login с параметром, называемым returnUrl.

, который returnUrl, кажется, используется для многих вещей, таких как получение контекста авторизации с помощью :

await _interaction.GetAuthorizationContextAsync(returnUrl);

Мой первый вопрос будет таким:

Откуда этот returnUrl? как / где он создан?

Второй вопрос:

Есть ли способ сохранить его где-нибудь в клиентском приложении после входа в систему? Я имею в виду, что в клиентском приложении есть момент, когда мы должны отправлять письма для создания новых учетных записей. Эти письма перенаправляют новых пользователей на страницу регистрации в IdentityServer. Я хотел бы иметь здесь returnUrl для перенаправления нового пользователя в правильное клиентское приложение.

Спасибо за ваше время!

РЕДАКТИРОВАТЬ:

вот URL возврата, установленный в моем клиенте (в IdentityServer):

RedirectUris = {"http://localhost:44349" + "/signin-oidc"}

, а вот returnUrl, получаемый методом Login в IdentityServer, когда я запускаю клиентское приложение

"/connect/authorize/callback?client_id=MyApplication_Web&redirect_uri=http%3A%2F%2Flocalhost%3A44349%2Fsignin-oidc&response_type=code%20id_token&scope=openid%20offline_access%20roles%20Cri_Identity_Serveur_Api.Full_Access&response_mode=form_post&nonce=637230882720491348.YmQzODA4ZTQtNDczZS00OWYwLWFmNmEtYjA2NmQ3YmIwZjg2YzdiODk4ZDYtMTU1YS00ZTM0LWE0MGEtNDVjOWNkZWFiYTM1&state=CfDJ8Ly2XCz96vdGkR4YQuJ4jeE-v9P4l1W7fLWpJcCGZpt1rMpXyWqEGdnaeRZfiZy4M4Z79LcixUbo06zImhsxwbgyV4hK82qmn0mI6wkrxwraT1tH3XNCdSXCfUJqwk_hZguMSwspZDEN6r1WxnZsU9kT8MHrb9qpzsMOMzsotVzToEjgMtxIeoRfqFSoK8ZfUXBkSw__qxVyIe1lCs96-I--ufZSyO2pBe2kfau-ah7eR5-9oopxX6x1k0tzFHAk6Y3_jMqGysES_GmmfeUJvXXFIR35Rc-IaxU1igswmL2h1IUS-0DQ98Tv_Gf3hirnS87SU87aSJhajgn2YmARXWc&x-client-SKU=ID_NETSTANDARD2_0&x-client-ver=5.3.0.0"

кажется, что для извлечения контекста авторизации с использованием await _interaction.GetAuthorizationContextAsync(returnUrl); returnUrl должен быть полным URL с "/connect/authorize/callback?..."

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Неправильный ответ Мартина неверен - returnUrl в данном случае - это URL-адрес конечной точки авторизации, который был первоначально запрошен клиентом. Если пользователь не аутентифицирован, то эта конечная точка будет перенаправлена ​​на ваш назначенный знак в конечной точке пользовательского интерфейса и включит этот параметр. GetAuthorizationContextAsync() просто анализирует этот URL-адрес и, если он совпадает с подписью URL-адреса конечной точки авторизации, он будет анализировать, проверять и возвращать вам объект, представляющий этот исходный запрос. Затем вы можете настроить поток входа в систему на основе этой информации (например, показать имя клиента, в который вы входите, или ограничить доступные методы входа в систему или любое другое).

Вы может включить этот URL в ваш процесс регистрации, но лично я предпочел бы одноразовый поток проверки электронной почты на основе кода, и это означает, что пользователь не теряет контекст, например, при входе в собственное мобильное приложение, а также не требуется почтовый клиент на устройстве, на которое они подписываются - например, на телефоне, который не имеет доступа к своей рабочей учетной записи электронной почты. У всех разные требования.

0 голосов
/ 21 апреля 2020

Откуда этот returnUrl? как и где он создан?

URL-адрес возврата указан как redirect_uri клиентом, который вызывает Identity Server. Это адрес обратного вызова.

Клиенты настраиваются в Identity Server, и для каждого настроенного клиента настраивается список разрешенных URI перенаправления для возврата токенов или кодов авторизации со свойством RedirectUris класса Client , Конфигурация находится в классе с именем Config, который имеет метод GetClients.

public class Config
{
    public static IEnumerable<Client> GetClients(IdentityServerAppSettings settings)
    {
        return new[]
        {
            new Client
            {
                ClientId = "roivenue-frontend",
                RedirectUris = new [] { "https://myappurl/somepage.html" }, // list of allowed URLs
                ...
            },

Если адрес, отправленный клиентом как redurect_uri, не совпадает ни с одним из настроенных адресов, проверка подлинности запроса завершается неудачно на Identity Server.

Есть ли способ сохранить его где-нибудь в клиентском приложении после входа в систему?

Адрес обратного вызова находится в разрабатываемом клиентском приложении. Это может быть любой адрес, известный Identity Server с указанной выше конфигурацией.

...