1

나는 유효한 ID 제공자가 있습니다. 내가 인증하기 위해 설계 한 클라이언트는 MVC와 웹 API를 결합한 단일 프로젝트입니다. 초기 인증은 MVC에서 수행됩니다. 액세스 토큰이 유효하지 않게되면 예상대로 새로 고칩니다.mvc 및 api를 사용하는 Identity Server 3 클라이언트가 액세스 토큰을 새로 고치지 않습니다.

MVC 측 :

공용 부분 클래스 시작 {

public void ConfigureAuth(IAppBuilder app) 
    { 
     //AntiForgeryConfig.UniqueClaimTypeIdentifier = "sub"; 
     JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>(); 

     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = "Cookies", 
      CookieName = "CookieName", 
      ReturnUrlParameter = "/Dashboard", 
      LogoutPath = new PathString("/"), 
     }); 
app.UseOpenIdConnectAuthentication(GetOpenIdConnectAuthenticationOptions()); 

    } 


    private OpenIdConnectAuthenticationOptions GetOpenIdConnectAuthenticationOptions() 
    { 
     var options = new OpenIdConnectAuthenticationOptions 
     { 
      ClientId = "client.id", 
      Authority = AuthorityUrl, 
      RedirectUri = RedirectUri, 
      PostLogoutRedirectUri = RedirectUri, 
      ResponseType = "code id_token", 
      Scope = "openid profile email offline_access roles company utc_offset service_api", 

      TokenValidationParameters = new TokenValidationParameters 
      { 
       NameClaimType = "name", 
       RoleClaimType = "role" 
      }, 

      SignInAsAuthenticationType = "Cookies", 
      Notifications = GetOpenIdConnectAuthenticationNotifications() 
     }; 
     return options; 
    } 

    private OpenIdConnectAuthenticationNotifications GetOpenIdConnectAuthenticationNotifications() 
    { 
     var container = UnityLazyInit.Container; 
     var authorizationProvider = container.Resolve<AuthorizationProvider>(); 
     var notifications = new OpenIdConnectAuthenticationNotifications 
     { 
      AuthorizationCodeReceived = async n => 
      { 
       authorizationProvider.Authority = Authority; 
       authorizationProvider.LoginMethod = LoginMethod; 
       var tokenResponse = await authorizationProvider.GetAccessAndRefreshTokens(n); 

       var userInfoClaims = await authorizationProvider.GetUserInfoClaims(tokenResponse); 

       userInfoClaims = authorizationProvider.TransformUserInfoClaims(userInfoClaims); 

       // create new identity 
       var id = new ClaimsIdentity(n.AuthenticationTicket.Identity.AuthenticationType); 
       id.AddClaims(userInfoClaims); 

       id.AddClaim(new Claim("access_token", tokenResponse.AccessToken)); 
       id.AddClaim(new Claim("expires_at", DateTime.Now.AddSeconds(tokenResponse.ExpiresIn).ToLocalTime().ToString())); 
       id.AddClaim(new Claim("refresh_token", tokenResponse.RefreshToken)); 
       id.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken)); 
       id.AddClaim(new Claim("sid", n.AuthenticationTicket.Identity.FindFirst("sid").Value)); 

       var user = authorizationProvider.GetUser(id); 

       var applicationClaims = authorizationProvider.GetApplicationClaims(user); 
       id.AddClaims(applicationClaims); 

       var permisionClaims = authorizationProvider.GetPermisionClaims(user); 
       id.AddClaims(permisionClaims); 

       n.AuthenticationTicket = new AuthenticationTicket(
        new ClaimsIdentity(id.Claims, n.AuthenticationTicket.Identity.AuthenticationType, "name", "role"), 
        n.AuthenticationTicket.Properties); 
      }, 

      RedirectToIdentityProvider = n => 
      { 
       // if signing out, add the id_token_hint 
       if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.LogoutRequest) 
       { 
        var idTokenHint = n.OwinContext.Authentication.User.FindFirst("id_token"); 

        if (idTokenHint != null) 
        { 
         n.ProtocolMessage.IdTokenHint = idTokenHint.Value; 
        } 
       } 

       return Task.FromResult(0); 
      } 

     }; 

     return notifications; 
    } 

} 

프레젠테이션 층 (브라우저 측) angulerjs하지만 I 인증에 대한 지원을 포함하지 않은 활용한다. 나는 MVC에 의존하고있다.

프리젠 테이션 계층에서 API를 호출하면 MVC에서 검색 한 액세스 토큰에 대해 자동으로 유효성을 검사하지만 만료되면 액세스 토큰을 새로 고칠 수 없습니다. 또한 무단으로 반환하지 않습니다. 새로 고치려고했지만 실패합니다. 프레젠테이션은 API 호출이 토큰 새로 고침을 시도 할 때 ID 공급자의 오류 페이지에 대한 HTML을받습니다.

어떻게 수정합니까? 그것은 나를 위해 인증 및 MVC 및 API에 대한 자동으로 새로 고쳐야 할 때 그들은 결합되어 있지만 나를 위해 작동하지 않는 것으로 보인다.

위의 시작 구성을 공유하려면 MVC와 API가 공유되어야합니다.

  new Client 
      { 
       ClientName = "MVC Client", 
       ClientId = "client.id", 
       ClientSecrets = new List<Secret> { 
        new Secret("secret".Sha256()) 
       }, 
       Flow = Flows.Hybrid, 

       AllowedScopes = new List<string> 

       { 

        Constants.StandardScopes.OpenId, 

        Constants.StandardScopes.Profile, 

        Constants.StandardScopes.Email, 

        Constants.StandardScopes.OfflineAccess, 

        "roles", 

        "company", 

        "utc_offset", 

        "service_api 

" },

   RequireConsent = false, 


       RedirectUris = new List<string> 

       { 

        REMOVED 
       }, 


       PostLogoutRedirectUris = new List<string> 
       { 
        REMOVED 
       }, 


       AllowedCorsOrigins = new List<string> 
       { 
        REMOVED 
       }, 

       AccessTokenLifetime = 60, 
       IdentityTokenLifetime = 60, 
       AbsoluteRefreshTokenLifetime = 60 * 60 * 24, 
       SlidingRefreshTokenLifetime = 60 * 15, 
      }, 

@brockallen

-.. 이것의 짧은 내가 MVC와 WEBAPI 및 Anjulgarjs있는 응용 프로그램이이 같은 하이브리드가 현명하다 생각하지 않고, 나는이 응용 프로그램을 상속 지금은 그것이 Idnetity 서버와 함께 작동하도록하는 방법을 찾아야한다 3.

내가. 대한 의견을 보내 주시기 바랍니다 것입니다.

답변

1

나는 너와 같은 문제를 안고 있었다. 문제는 MVC에 대한 쿠키를 설정하고 있지만 만료일을 설정하지 않았기 때문에 MVC는 쿠키가 만료되었음을 알지 못합니다. 당신은 다음과 같은 방법으로 AuthenticationTicket의 만료 날짜를 설정해야 할 일은 : 나는 또한 발행 날짜를 설정했지만, 그 필수 아니다

    n.AuthenticationTicket.Properties.ExpiresUtc = DateTimeOffset.UtcNow.AddSeconds(int.Parse(n.ProtocolMessage.ExpiresIn)); 
        n.AuthenticationTicket.Properties.IssuedUtc = DateTime.Now; 
        //Add encrypted MVC auth cookie 
        n.AuthenticationTicket = new AuthenticationTicket(
         nid, 
         n.AuthenticationTicket.Properties);