2017-09-17 17 views
0

J'essaie d'utiliser Keycloak comme serveur de connexion unique pour plusieurs applications ASP.Net. J'ai trouvé une bibliothèque sur Github par l'appel KeycloakOwinAuthentication et j'ai cloné l'exemple de code fourni dedans deux fois pour l'utiliser comme deux applications différentes.Utilisation de Keycloak comme solution de connexion unique pour les applications ASP.Net

configuré à 2 applications (App1 et App2) dans le même domaine dans Keycloak, créé à l'utilisateur de test avec tous les rôles et a essayé de se connecter

Comportement attendu:. Connectez-vous depuis l'application d'un, rafraîchir App2 et vous Le résultat est le suivant: connectez-vous à partir de l'application 1, rafraîchissez l'application 2 et obtenez "Erreur de serveur dans l'application '' Si je me déconnecte de App1 et que j'essaie de rafraîchir App2, ça marche très bien!

Mes 2 exemples d'application peuvent être trouvés here ... Mon ActionResult pour le p protégé âge, ce qui montre le jeton dans la vue ressemble à ceci:

[Authorize] 
    public ActionResult About() 
    { 
     ViewBag.Message = "Your application description page."; 
     var userPrincipal = User as ClaimsPrincipal; 
     ViewBag.Something = userPrincipal.Identity.ToString(); 
     return View(userPrincipal); 

    } 

et ma page de démarrage ressemble à ceci:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     const string persistentAuthType = "Keycloak_Cookies"; 

     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = persistentAuthType 
     }); 

     app.SetDefaultSignInAsAuthenticationType(persistentAuthType); 

     app.UseKeycloakAuthentication(new KeycloakAuthenticationOptions 
     { 
      Realm = "MyRealm", 
      ClientId = "App3", 
      ClientSecret = "KeycloakClientSecret", 
      KeycloakUrl = "http://localhost:8080/auth", 
      SignInAsAuthenticationType = persistentAuthType 
     }); 

Y at-il une configuration specefic que j'ai manqué? J'ai utilisé mon royaume de test ainsi qu'un royaume de travail avec 3 applications différentes (pas Asp) mais je n'ai pas réussi à être connecté à tous les clients. J'utilisais le même navigateur avec deux onglets pour faire en sorte que tous les cookies sont accessibles ...

Texte d'erreur:

Server Error in '/' Application. 
IDX10214: Audience validation failed. Audiences: 'App1'. Did not match: validationParameters.ValidAudience: 'null' or validationParameters.ValidAudiences: 'null, App2' 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.IdentityModel.Tokens.SecurityTokenInvalidAudienceException: IDX10214: Audience validation failed. Audiences: 'App1'. Did not match: validationParameters.ValidAudience: 'null' or validationParameters.ValidAudiences: 'null, App2' 
Source Error: An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. 
+0

Vous êtes invité à publier votre exemple de code ici, pas un site tiers qui peut changer ou disparaître demain: [mcve] – Rob

Répondre

0

Je suis allé plus profondément dans le code de la bibliothèque tout et a trouvé qu'il ya un drapeau ce qui désactive le contrôle d'audience. Il doit être défini dans la configuration Keycloak du fichier Startup.cs. L'indicateur DisableAudienceValidation est false par défaut, mais en l'ajoutant à la configuration et en définissant sa valeur sur true, la validation de l'audience est ignorée.

  app.UseKeycloakAuthentication(new KeycloakAuthenticationOptions 
     { 
      Realm = "DotNetApps", 
      ClientId = "TestingApp", 
      ClientSecret = "Client_Secret_Goes_Here", 
      KeycloakUrl = "http://localhost:8080/auth", 
      SignInAsAuthenticationType = persistentAuthType, 
      DisableAudienceValidation = true 

     });