web-dev-qa-db-ja.com

ADFS 2012 R2(3.0)JSON Webトークンの検証

私たちのクライアントは、私たちが構築している内部アプリの2つのセキュリティ機能の主要な手段としてADFS 2012 R2(別名3.0)を利用することを望んでいます。

  1. Webアプリ(2つの.NETとAngularがあります)とiOSアプリは、ADFS内でOAUTHフローを使用します
  2. トークンフローが完了すると、ADFSによって作成されたJWTは、Springで作成されているRESTful APIに渡されます
  3. Spring APIは、呼び出しの続行を許可する前にJWTを検証する必要があります

OAUTHフローにADFSを使用することは私たちにとって新しいことであり、いくつかの質問がポップアップしました。回答を探すためにインターネットを精査しました。それらの多くは、 MSのみの技術(ADAL、.NET/C#ベースのAPI、OWIN、カタナ)を使用したソリューション。したがって、SEを介して回答をクラウドソーシングしたいと考えていました。どんな助けも大歓迎です。

この時点で、次のことが可能になりました。

  • ADFSでPowerShellコマンドを使用してOAUTHクライアントを登録する
  • ADFSで "偽の"リソースを証明書利用者として登録する
  • ADFSを呼び出して認証を行い、返されたJWTを取得するようにクライアントを設定します。

このリンクは、セットアップの説明に非常に役立ちました。

http://blogs.technet.com/b/askpfeplat/archive/2014/11/03/adfs-deep-dive-comparing-ws-fed-saml-and-oauth-protocols.aspx

次に、JWTを検証するために、Spring APIにコードを配置する必要があります。

OAUTHフローのすべての例で、発行者とクライアントの間に共有秘密があります。この秘密は、JWTが偽装されていないことを確認するために使用されます。

これまでADFSで行ったセットアップでは、秘密鍵や共有秘密の定義はありません。認証ヘッダーからJWTを取得してデコードできます。しかし、署名を検証する手段がないようです。

質問は、署名の構築に使用された「秘密」を持たずにADFSから返される(ヘッダーを介してクライアントから渡される)Spring API内のJWTをどのように検証するかです。

これが機能しない場合のオプションは次のとおりです。

  • Oracle Identity Manager/Access Manager(すでに社内)を使用する
  • WSO2 Identity Managerを写真に取り入れます
5
soglm

私はこの同じ質問に過去数日間答えようとしています。 JWT応答を暗号化/署名する場合、OAUTH2のWindows Server 2012 R2 ADFS 3.0実装では、共有シークレットの代わりに証明書を使用する必要があるようです。 Microsoft以外の複数のWebアプリケーションでOAUTH2を使用してきたので、証明書ではなく共有シークレットを常に見てきました。 OAUTH2標準はどちらでも可能だと思いますが、Microsoftは標準の最初の実装で彼らが知っていることを採用することにしました。

これまでのところ、Microsoftの従業員ブログから引用された、「標準」のOAUTH2はADFS 3.0でサポートされていないものだと思われる引用を1つ見ました。

から http://blogs.technet.com/b/maheshu/archive/2015/05/26/json-web-token-jwt-support-in-adfs.aspx

Windows Server 2012 R2でADFSによって発行されたJWTは、ADFSの発行証明書を使用して署名されます。 ADFSはJWT暗号化をサポートしていません。

また、Windows Server 2016のADFSの新機能は、共有シークレットが新機能になることを指摘しています。

(リンク以外のリンクについては申し訳ありません。ここでは評判がないため、この投稿に含めることができるリンクは1つだけです。)Fromtechnet.Microsoft.com/en-us/library/mt617220.aspx (エンファシス鉱山)

AD FS for Windows Server 2016は、Oauth Windows Server 2012 R2で導入され、Webアプリ、Web API、ブラウザー、およびネイティブクライアントベースのアプリ間の最新および業界標準ベースの認証フローを可能にします。WindowsServer 2012 R2は、Oauth承認付与フローと承認コード付与タイプ(パブリッククライアントのみ)Windows Server 2016では、以下の追加のプロトコルと機能がサポートされています。

  • OpenId Connectのサポート
  • 追加Oauth認証コード付与タイプ
    • 暗黙的なフロー(単一ページアプリケーションの場合)
    • リソース所有者のパスワード(スクリプトアプリ用)
  • OAuth機密クライアント(Webサーバーで実行されているアプリやサービスなど、独自の秘密を維持できるクライアント)
  • Oauth機密クライアント認証方式
    • 対称(共有秘密/パスワード)
    • 非対称鍵
    • Windows統合認証(WIA)
  • 基本的なOauthサポートの拡張として、「代理」フローのサポートが流れます。

詳細については、Oauth ADでの機密クライアントの有効化FS 2016およびADでのOpenId Connectの有効化FS 2016を参照してください。

開発者として、IISボックスをドメインにハンドラーページ(ASHX)で設定して、ドメインユーザーを確認し、ユーザーをWebアプリにリダイレクトします。共有キーは、Windows Server 2016が利用可能になるまでのシンプルなソリューションです。これを行う方法のサンプルコードは、アプリケーションのフォーラムにありますconnectionsonline.zendesk.com/entries/82271995-Single-Sign-on- Authentication-SSO-with-OAuth-2-0

2
bts

あなたの質問を正しく理解した場合、署名は、設定された トークン署名証明書 に基づくSHA-256ハッシュを使用するRSASSAです。

GitHub にNode.js検証の例があります。詳細は ブログ投稿 をご覧ください。

2
Chris

JWTトークンを取得できる場合は、WebAPIを使用することで簡単になります。C#アプリケーションの場合、次のコードで使用できます(Owin nugetパッケージ)

app.UseActiveDirectoryFederationServicesBearerAuthentication(
new ActiveDirectoryFederationServicesBearerAuthenticationOptions
{
    Audience = "The AppId Registered In ADFS",
    MetadataEndpoint = "https://fs.domain.com/federationmetadata/2007-06/federationmetadata.xml"
});

windowsサーバー2012-r2でブログのsecure-a-web-api-with-adfsを参照 here

0
Haroon