Je tente de faire fonctionner le flux implicite pour IdentityServer4. La connexion et la déconnexion fonctionnent correctement, cependant le PostLogoutRedirectUri revient à zéro, en dépit de la définition de la valeur où il doit être défini. Ce que je voudrais, c'est que le processus de déconnexion redirige vers mon application une fois la déconnexion terminée.IdentityServer4 PostLogoutRedirectUri null
Je reçois le logoutId correctement, et déconnexion des appels BuildLoggedOutViewModelAsync:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Logout(LogoutInputModel model)
{
var vm = await _account.BuildLoggedOutViewModelAsync(model.LogoutId);
...
Cette méthode est situé dans ma classe AccountService.cs, qui appelle ensuite la GetLogoutContextAsync du DefaultIdentityServiceInteractionService:
public async Task<LoggedOutViewModel> BuildLoggedOutViewModelAsync(string logoutId)
{
// get context information (client name, post logout redirect URI and iframe for federated signout)
var logout = await _interaction.GetLogoutContextAsync(logoutId);
...
Ce qui crée un IdentityServer4.Models.LogoutRequest.
La propriété de chaîne SignOutIFrameUrl
est définie sur "http://localhost:5000/connect/endsession/callback?sid=bf112f7785bc860fcc4351893012622e&logoutId=d6649e7f818d9709b2c0bc659696abdf"
mais rien d'autre ne semble avoir été renseigné dans LogoutRequest.
Malheureusement, cela signifie que la PostLogoutRedirectUri
est nulle et la AutomaticRedirectAfterSignOut
est également nulle, et lorsque la page LoggedOut.cshtml
est chargé, le fichier est signout-callback.js
jamais chargé:
@section scripts
{
@if (Model.AutomaticRedirectAfterSignOut)
{
<script src="~/js/signout-redirect.js"></script>
}
}
Voici mes paramètres de configuration.
Config.cs:
public static IEnumerable<Client> GetClients()
{
return new List<Client>
{
new Client
{
ClientId = "implicit.client",
AllowedGrantTypes = GrantTypes.Implicit,
AllowAccessTokensViaBrowser = true,
AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
"ContractManagerAPI"
},
RedirectUris = { "http://localhost:9000/" },
PostLogoutRedirectUris = { "http://localhost:9000/" },
AllowedCorsOrigins = { "http://localhost:9000" },
RequireConsent = false,
}
};
}
app.ts (client de):
import {UserManager} from 'oidc-client';
import { inject, Factory } from 'aurelia-framework';
@inject(Factory.of(UserManager))
export class App {
userManager: UserManager;
constructor(userManagerFactory){
let config = {
authority: 'http://localhost:5000',
client_id: 'implicit.client',
response_type: 'id_token token',
scope: 'openid profile ContractManagerAPI',
redirect_uri: 'http://localhost:9000/',
post_logout_redirect_uri: 'http://localhost:9000/'
};
this.userManager = userManagerFactory(config);
}
login(){
this.userManager.signinRedirect();
}
logout(){
this.userManager.signoutRedirect();
}
}
parties pertinentes de Startup.cs:
services.AddIdentityServer()
.AddTemporarySigningCredential()
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddContractManagerUserStore()
.AddProfileService<ContractManagerProfileService>();
Toute aide à déterminer où Je vais mal serait grandement apprécié.
Merci!
salut @ JayDeeEss, j'ai essayé d'ajouter logouturl au IdentityServer, mais pas de chance. Je n'ai pas de client MVC, c'est un client javascript. J'utilise le fichier oidc-client.js, et d'après ce que je peux dire, il n'y a pas de propriété logout_url. – user2921364
Bonjour @ utilisateur2921364! J'ai créé un client angulaire (flux implicite) avec vos configurations et son fonctionnement.La seule chose que je peux penser est de s'assurer que l'option "AutomaticRedirectAfterSignout" est définie sur true dans AccountOptions.cs sous services. Voici à quoi ressemble ma classe AccountOptions: (vérifiez la réponse ci-dessus) – JayDeeEss
Salut @JayDeeEss, merci pour votre contribution. Il s'avère que c'était beaucoup moins intuitif. J'ai eu mon nouveau script Oidc.UserManager(). SignRedirectCallback(). Then ... 'situé sur la page index.html. J'ai décidé de suivre les instructions pour le 'T' et déplacé cela à sa propre page callback.html. Une fois que j'ai fait ça, tout a commencé à fonctionner. Le plus gros indice était que 'userManager.getUser()' renvoyait toujours null, même en étant connecté. J'ai réalisé que quelque chose manquait dans le processus de connexion. – user2921364