2016-05-04 2 views
3

Я пытаюсь подключить свое веб-приложение MVC5 с сервером Keycloak v1.98, оно подключено, и когда я обращаюсь к своему веб-приложению, Keycloak требует ввода учетных данных, но когда я вхожу это, я получаю ниже исключение:keycloak не работает с веб-приложением MVC5

Мои настройки (startup.cs):

public void Configuration(IAppBuilder app) 
    { 
     const string persistentAuthType = "WebApplication1_cookie_auth"; 

     // --- Cookie Authentication Middleware - Persists user sessions between requests 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = persistentAuthType 
     }); 
     app.SetDefaultSignInAsAuthenticationType(persistentAuthType); // Cookie is primary session store 

     // --- Keycloak Authentication Middleware - Connects to central Keycloak database 
     app.UseKeycloakAuthentication(new KeycloakAuthenticationOptions 
     { 
      // App-Specific Settings 
      ClientId = "dotnettest", // *Required* 

      VirtualDirectory = "", // Set this if you use a virtual directory when deploying to IIS 

      // Instance-Specific Settings 
      Realm = "dotnettest", // Don't change this unless told to do so 
      KeycloakUrl = "http://127.0.0.1:9090/auth", // Enter your Keycloak URL here 

      // Template-Specific Settings 
      SignInAsAuthenticationType = persistentAuthType, // Sets the above cookie with the Keycloak data 
      AuthenticationType = "WebApplication1_keycloak_auth", // Unique identifier for the auth middleware 
      ClientSecret = "187a2ba7-91f9-479f-a290-2b249a64236a" 
     }); 
    } 

Exception Details: System.Exception: Both the access token and the refresh token have expired 

Stack Trace: 

[Exception: Both the access token and the refresh token have expired] 
    KeycloakIdentityModel.<GetClaimsAsync>d__39.MoveNext() +708 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 
    KeycloakIdentityModel.<ToClaimsIdentityAsync>d__25.MoveNext() +156 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 
    System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task) +11522180 
    Owin.Security.Keycloak.Middleware.<InvokeAsync>d__1.MoveNext() +1066 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 
    Microsoft.Owin.Security.Infrastructure.<Invoke>d__0.MoveNext() +445 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 
    Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.<RunApp>d__5.MoveNext() +187 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 
    Microsoft.Owin.Security.Infrastructure.<Invoke>d__0.MoveNext() +653 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 
    Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.<RunApp>d__5.MoveNext() +187 
    System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) +92 
    System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) +58 
    Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.<DoFinalWork>d__2.MoveNext() +185 
    Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.StageAsyncResult.End(IAsyncResult ar) +69 
    Microsoft.Owin.Host.SystemWeb.IntegratedPipeline.IntegratedPipelineContext.EndFinalWork(IAsyncResult ar) +64 
    System.Web.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +380 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155 

Я после этого учебника: https://github.com/dylanplecki/KeycloakOwinAuthentication/wiki/ASP.NET-MVC-Tutorial

Спасибо.

+0

Сообщите мне, зарегистрируйтесь ли вы в MVC 5 как внешний провайдер? Я следил за направляющей линией, но успеха не было, кнопка не появилась. – Madnik7G

+1

@ Madnik7G попытайтесь создать новый проект (asp.net mvc 5) и следуйте руководству, тогда его работа будет прекрасна, вам не нужно регистрировать все, что вы будете использовать провайдер членства asp.net, просто изменив способ настройки в startup.cs file, –

ответ

5

Решено, отредактировав часовой пояс машины в (utc -1: 00), эта проблема возникает из-за ошибки в проекте KeycloakOwinAuthentication, и об ошибке сообщается разработчику проекта.

Вы можете решить эту проблему, отредактировав метод «GetClaimsAsync» в файле «KeycloakIdentity.cs», чтобы сравнить текущую дату и время в зоне (UTC-1).

private async Task<IEnumerable<Claim>> GetClaimsAsync() 
     { 
      await _refreshLock.WaitAsync(); 
      try 
      { 
       // Check to update cached claims, but not if refresh token is missing (as in bearer mode) 
       if ((_kcClaims == null || _accessToken.ValidTo <= DateTime.Now) && _refreshToken != null) 
       { 
        var info = TimeZoneInfo.FindSystemTimeZoneById("Tokyo Standard Time"); 
        DateTimeOffset localServerTime = DateTimeOffset.Now; 
        DateTimeOffset utc = localServerTime.ToUniversalTime(); 
        // Validate refresh token expiration 
        if (_refreshToken.ValidTo <= utc.AddHours(-1)) 
         throw new Exception("Both the access token and the refresh token have expired"); 
        // Load new identity from token endpoint via refresh token 
        await RefreshIdentity(_refreshToken.RawData); 
       } 
       return GetCurrentClaims(); 
      } 
      finally 
      { 
       _refreshLock.Release(); 
      } 
     } 
+0

После этого вам нужно перестроить оба проекта и вручную добавить к вашему проекту файлы с ключами KeycloakIdentityModel и Owin.Security.Keycloak и использовать их вместо оригинальных, которые вы установили ранее через пакет NuGet – j0zeft