2017-11-30 3 views
0

モバイルクライアントから送信されたベアラトークンを検証するために、.Net Core Web API(.Net Framework)をADFS 3.0(2012)を使用するように構成する必要があります。.net ADFS 2012でコアのApi認証

私はADFSサーバーからaccess_tokenを生成することができ、それをAuthorizationヘッダーに渡します。

私の問題はAPIにあります:ユーザーを検証して自動化するにはどうすれば設定できますか?

私は多くの場所で検索しましたが、それを行うための決定的な方法は見つかりませんでした。

IdentityServer4(それは私が別の方法を使用することはできませんJWTとADFSはOpenIDを しようとしましたUseOpenIdConnectAuthentication(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でメタデータを取得するために行ったことだったが、ADFS 3.0は、OpenIDのをサポートしていないと、これは私が別の記事で読ん404

を返します。 (私はそれを見つけるときに私はそれを更新します)場合は、正しい設定では、それは設定を取得する必要はありません。しかし、どのような構成ですか?

私は、OpenIdConnectConfigurationオブジェクトをJwtBearerOptionsのConfigurationプロパティに渡すと、(MS)コードが深刻であることがわかりました。メタデータをフェッチしません。

だからここに私のコードは以下のようになります。

var rawCertData = Convert.FromBase64String(options.X509SigninCertificate); 

X509Certificate2 cert = new X509Certificate2(rawCertData); 

SecurityKey signingKey = new X509SecurityKey(cert); 

X509の証明書のデータは、このURL

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

でサポートADFSメタデータから来ていることは、これを含んでいます

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

私は私の設定の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 * vs 2.0以降では異なる実装が必要です。

関連する問題