2017-06-21 3 views
2

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!

Répondre

0

Essayez de configurer LogoutUrl pour le client MVC!

+0

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

+0

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

+2

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

0

Assurez-vous que ces paramètres correctement configurés:

public class AccountOptions 
     { 
      public static bool AllowLocalLogin = true; 
      public static bool AllowRememberLogin = true; 
      public static TimeSpan RememberMeLoginDuration = TimeSpan.FromDays(30); 

      public static bool ShowLogoutPrompt = false; 
      public static bool AutomaticRedirectAfterSignOut = true; 

      public static bool WindowsAuthenticationEnabled = false; 
      // specify the Windows authentication schemes you want to use for authentication 
      public static readonly string[] WindowsAuthenticationSchemes = new string[] { "Negotiate", "NTLM" }; 
      public static readonly string WindowsAuthenticationDisplayName = "Windows"; 

      public static string InvalidCredentialsErrorMessage = "Invalid username or password"; 
     } 
2

passe id_token_hint arg à signoutRedirect()

vous pouvez obtenir id_token_hint de l'objet retourné par l'utilisateur signinRedirect(); Disons donc que vous avez une variable appelée "user" dans votre fichier ts qui a été définie à la suite de la connexion de l'utilisateur via signinRedirect().

alors vous faire ...

logout(){ 
    this.userManager.signoutRedirect({ 'id_token_hint': this.user.id_token }); 
}