2017-11-30 23 views
0

.Net Core Web API (.Net Framework)가 ADFS 3.0 (2012)을 사용하여 모바일 클라이언트가 전송하는 무기명 토큰의 유효성을 검사하도록 구성해야합니다..net ADFS 2012 핵심 코어 Api 인증

ADFS 서버에서 access_token을 생성 할 수 있으며이를 Authorization 헤더에 전달합니다.

내 문제는 API에 있습니다. 어떻게 사용자의 유효성을 검사하고 사용자를 자동 화하도록 구성합니까?

여러 곳에서 수색했는데이를 수행하는 확실한 방법을 찾을 수 없었습니다.

는 지금까지 시도 무엇 : 그것은 오픈 ID 시도 UseOpenIdConnectAuthentication (IdentityServer4에서 발견 예) 사용자 정의 미들웨어가 나는 다른 방법을 사용할 수 없습니다를 제공하지 않습니다 JWT와 ADFS를 사용하기 때문에

사용 IdentityServer4은 (실패 ., 내가으로 OAuth2를 지원해야

을 그래서, 내가 어떻게해야합니까 여기

내 최신 시도입니다 :

var connectOptions = new OpenIdConnectOptions 
    { 
     AuthenticationScheme = "adfs", 
     SignInScheme = "idsrv.external", //IdentityServerConstants.ExternalCookieAuthenticationScheme, 
     SignOutScheme = "idsrv", //IdentityServerConstants.SignoutScheme, 
     AutomaticChallenge = false, 
     DisplayName = "ADFS", 
     Authority = $"https://{options.AdfsHostName}/adfs/oauth2", 
     ClientId = options.ClientID, 
     ResponseType = "id_token", 
     Scope = { "openid profile" }, 
     CallbackPath = new PathString("/signin-adfs"), 
     SignedOutCallbackPath = new PathString("/signout-callback-adfs"), 
     RemoteSignOutPath = new PathString("/signout-adfs"), 
     ClaimsIssuer = $"https://{options.AdfsHostName}/adfs/services/trust", 
     //TokenValidationParameters = new TokenValidationParameters 
     //{ 
     // ValidateIssuer = true, 
     // ValidIssuer = $"https://{options.AdfsHostName}/adfs/services/trust" 
     //}, 

    }; 

    app.UseOpenIdConnectAuthentication(connectOptions); 

유효한 토큰을 사용하여 모든 통화에서 매우 빠른 401을 받았습니다. 사실 콘솔 창에서 연결이 표시되는 동안 보안 유효성 검사와 관련하여 Roslyn 콘솔 창에 다른 로그가 표시되지 않습니다.

현재 ASP.Net Core 1.1.X를 사용하고 있습니다. .Net Core 2.0으로 이동하는 것을 피할 수 있으면 프로젝트가 늦고 많은 변경 사항이 포함되어 있으므로 ...

자세한 정보를 요청하는 것이 좋습니다. 모든 좋은 조언을 부탁드립니다.

답변

1

우리는 ADFS 3.0에서 JwtBearerAuthentication을 사용할 수 있습니다. 그것으로

내 초기 문제는 /.well-known/openid-configuration에서 메타 데이터를 가져 갔다했지만, 오픈 ID를 지원하지 않습니다 3.0 ADFS이 내가 다른 게시물 읽기 (404)

반환 (내가 그것을 발견 할 때 그것을 업데이트 할 것입니다.) 올바른 설정을 사용하면 설정을 가져올 필요가 없습니다. 그러나 어떤 구성입니까?

글쎄 나는 (MS) 코드에서 OpenIdConnectConfiguration 객체를 JwtBearerOptions의 Configuration 속성에 전달하면 메타 데이터를 가져 오지 않는다는 사실을 발견했습니다.

<KeyDescriptor use="signing"> 
    <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
     <X509Data> 
      <X509Certificate>SOMEUUENCDODEDSTRING=</X509Certificate> 
     </X509Data> 
    </KeyInfo> 
</KeyDescriptor> 

I :

는 X509의 인증서 데이터는 다음 URL에서 지원되는 ADFS 메타 데이터에서 오는
var rawCertData = Convert.FromBase64String(options.X509SigninCertificate); 

X509Certificate2 cert = new X509Certificate2(rawCertData); 

SecurityKey signingKey = new X509SecurityKey(cert); 

https://Your.ADFS.Site/FederationMetadata/2007-06/FederationMetadata.xml 

그것은이 포함되어 있습니다 그래서 여기

지금 내 코드입니다 단순히 내 설정의 X509SigninCertificate 속성에 UUEncoded 문자열을 복사했습니다.

var tokenValidationParameters = new TokenValidationParameters 
     { 
      // The signing key must match! 
      ValidateIssuerSigningKey = true, 
      IssuerSigningKey = signingKey, 

      // Validate the JWT Issuer (iss) claim 
      ValidateIssuer = true, 
      ValidIssuer = $"https://{options.AdfsHostName}/adfs/services/trust", 

      // Validate the JWT Audience (aud) claim 
      ValidateAudience = true, 
      ValidAudience = options.ClientUri, //"https://YOUR-AUDIENCE/", 

      // Validate the token expiry 
      ValidateLifetime = true, 


      // If you want to allow a certain amount of clock drift, set that here: 
      ClockSkew = TimeSpan.Zero 
     }; 

     var connectOptions = new OpenIdConnectConfiguration 
     { 
      Issuer = $"https://{options.AdfsHostName}/adfs/services/trust", 
     }; 

     app.UseJwtBearerAuthentication(new JwtBearerOptions 
     { 
      AutomaticAuthenticate = true, 
      AutomaticChallenge = true, 
      TokenValidationParameters = tokenValidationParameters, 
      Configuration = connectOptions     
     }); 

중요한 라인은 여기

Configuration = connectOptions 

이 일을하는 것입니다, 당신은 메타 데이터를 가져 오지하기 위해 검증을 말한다. 그처럼 간단합니다.

내 토큰 (AUD, ISS 및 SIGN)의 유효성을 검사 할 수 있었고 프로젝트에서 ADFS를 사용할 수 있습니다.

0

ADFS 2016 만 OpenID Connect를 지원합니다. 2012 년에 OAuth 엔드 포인트를 사용하려면 자체 인증 처리자를 작성해야합니다. 구축 할 예는 ASP.NET Core's own Twitter implementation입니다. 이러한 처리기는 ASP.NET Core 1 * v 2.0 이상에서 다르게 구현해야합니다.