Сервер идентификации 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);`
Контекст содержит пару свойств, которые я ожидал заполнить, а именно:
- ID клиента
- Имя клиента
- 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"
},
};