Сервер идентификации Duende — получить PostLogoutRedirectUri после выхода из моего клиентского приложения

Я создаю сервер Identity с пакетом программного обеспечения сервера Duende Identity.

IdentityServer — это .Net 6, а клиентское приложение — ASP.NET 4.6.2, что может все усложнить.

В моем клиентском приложении у меня есть следующая конфигурация:

      `   app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
    {
    ClientId = "SomeId",
    Authority = "https://localhost:5001",
    RedirectUri = "https://localhost:5002",
    ClientSecret = "SomeSecret",
    ResponseType = "Code",
    Scope = "SomeScopes,
    PostLogoutRedirectUri = "https://localhost:5002/some-custom-path",

    SignInAsAuthenticationType = "Cookies",
    UseTokenLifetime = false,
            
    RedeemCode = true,
    SaveTokens = true,
    Notifications = new OpenIdConnectAuthenticationNotifications
    {
        SecurityTokenValidated = async context =>
        {
            var identity = context.AuthenticationTicket.Identity;
            var claims = identity.Claims;
            await Task.Yield();
        }
    }
});`

Предполагая, что конфигурация OpenID верна (мы можем соединить оба приложения вместе и войти и выйти из системы через его страницы входа и выхода), мы не можем получить PostLogoutRedirectUri в LogoutContext:

      `    var context = await _interaction.GetLogoutContextAsync(LogoutId);`

Контекст содержит пару свойств, которые я ожидал заполнить, а именно:

  1. ID клиента
  2. Имя клиента
  3. PostLogoutRedirectUri

Каким-то образом эти значения равны нулю в моем контексте. Может ли кто-нибудь объяснить, почему это так здесь?

Мы попытались передать postLogoutRedirectUri черезRedirectToIdentityProviderв клиентском приложении, что также привело к нулевому результату.

Мы искали в Интернете, но большинство решений, с которыми мы сталкивались, предназначены для .NET Core, который не подходит для нашего клиентского приложения.

Мы также попробовали решение в следующем посте: Как перенаправить пользователя в клиентское приложение после выхода из сервера идентификации?, что также не сработало с нашей стороны.

ОБНОВЛЕНИЕ: Добавить метод выхода из системы в клиенте:

      HttpCookie userCookie = new HttpCookie("UserCookie", "");
        userCookie.Expires = DateTime.Now.AddYears(-1);
        Response.Cookies.Add(userCookie);

        HttpContext.GetOwinContext().Authentication.SignOut(
                OpenIdConnectAuthenticationDefaults.AuthenticationType,
                CookieAuthenticationDefaults.AuthenticationType);

        return null;

1 ответ

@Брайан, пожалуйста, проверьте, добавили ли вы свои клиентские приложения PostLogoutUri (это https://localhost:5002/some-custom-path) в PostLogoutRedirectUris клиента на Identity Server, где вы зарегистрировали клиента.

Вам необходимо добавить свои клиентские приложения postlogouturl в свой клиент на сервере идентификации.

Например:

      var interactiveClient = new Client
{
    ClientId = "interactive",

    AllowedGrantTypes = GrantTypes.Code,
    AllowOfflineAccess = true,
    ClientSecrets = { new Secret("secret".Sha256()) },
    
    RedirectUris =           { "http://localhost:21402/signin-oidc" },
    PostLogoutRedirectUris = { "https://localhost:5002/some-custom-path" },
    FrontChannelLogoutUri =    "http://localhost:21402/signout-oidc",

    AllowedScopes = 
    {
        IdentityServerConstants.StandardScopes.OpenId,
        IdentityServerConstants.StandardScopes.Profile,
        IdentityServerConstants.StandardScopes.Email,

        "api1", "api2.read_only"
    },
};
Другие вопросы по тегам