私たちのクライアントは、私たちが構築している内部アプリの2つのセキュリティ機能の主要な手段としてADFS 2012 R2(別名3.0)を利用することを望んでいます。
OAUTHフローにADFSを使用することは私たちにとって新しいことであり、いくつかの質問がポップアップしました。回答を探すためにインターネットを精査しました。それらの多くは、 MSのみの技術(ADAL、.NET/C#ベースのAPI、OWIN、カタナ)を使用したソリューション。したがって、SEを介して回答をクラウドソーシングしたいと考えていました。どんな助けも大歓迎です。
この時点で、次のことが可能になりました。
このリンクは、セットアップの説明に非常に役立ちました。
次に、JWTを検証するために、Spring APIにコードを配置する必要があります。
OAUTHフローのすべての例で、発行者とクライアントの間に共有秘密があります。この秘密は、JWTが偽装されていないことを確認するために使用されます。
これまでADFSで行ったセットアップでは、秘密鍵や共有秘密の定義はありません。認証ヘッダーからJWTを取得してデコードできます。しかし、署名を検証する手段がないようです。
質問は、署名の構築に使用された「秘密」を持たずにADFSから返される(ヘッダーを介してクライアントから渡される)Spring API内のJWTをどのように検証するかです。
これが機能しない場合のオプションは次のとおりです。
私はこの同じ質問に過去数日間答えようとしています。 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
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