1

を使用したWebアプリケーションとWeb APIのトークンベース認証シナリオ: WebアプリケーションとWeb APIの両方を認証し、サーバー側から保護する必要があります。Azure AD B2C

要件: Webアプリケーションは、ブラウザのためのコンテンツを提供していると、ブラウザは、(APIへつまりブラウザ)直接のWeb APIを呼び出す必要があります。

質問: トークンを使用してWeb APPとAPIの両方を認証できますか。

サンプルコードまたは明確な指示は高く評価されます。


通常のWebアプリケーションは、クッキーとAPIを使用して認証されtokens.Thereを使用して認証されhere利用できるいくつかのサンプルプロジェクトですが、彼らは、サーバーからのAPIを呼び出すいずれかのAPIへのブラウザ(SPAトークンベース)、またはサーバー側のWebアプリケーションですサーバ。

UPDATE 1

アプリTokenValidationParametersを節約し、サーバへの通信サーバのためつかむためにアプリコントローラ内bootstrapContext.Token使用されます。

@dstrockisによると、私はid_tokenをWebアプリケーションから取得しようとしています。検証の終了後すぐに(アプリケーション制御装置内ではありません)。

私は、Startupクラスの中でにSecurityTokenValidated呼び出し者を使用しています。 SecurityTokenValidatedSecurityTokenValidatedNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions>タイプのパラメータを受け取りますが、id_tokenがどこにあるかはわかりません。メソッドは以下の通りです。

private OpenIdConnectAuthenticationOptions CreateOptionsFromPolicy(string policy) 
{ 
    return new OpenIdConnectAuthenticationOptions 
    { 
     // For each policy, give OWIN the policy-specific metadata address, and 
     // set the authentication type to the id of the policy 
     MetadataAddress = String.Format(aadInstance, tenant, policy), 
     AuthenticationType = policy, 

     // These are standard OpenID Connect parameters, with values pulled from web.config 
     ClientId = clientId, 
     RedirectUri = redirectUri, 
     PostLogoutRedirectUri = redirectUri, 
     Notifications = new OpenIdConnectAuthenticationNotifications 
     { 
      AuthenticationFailed = OnAuthenticationFailed, 

      //NEW METHOD INVOKE ************************************ 
      //****************************************************** 
      SecurityTokenValidated = OnSecurityTokenValidated 

      //****************************************************** 
     }, 
     Scope = "openid", 
     ResponseType = "id_token", 

     TokenValidationParameters = new TokenValidationParameters 
     { 
      NameClaimType = "name", 
      SaveSigninToken = true 
     }, 
    }; 
} 



//NEW METHOD ************************************ 
private Task OnSecurityTokenValidated(
     SecurityTokenValidatedNotification<OpenIdConnectMessage, 
         OpenIdConnectAuthenticationOptions> arg) 
{ 
    //QUESTION ******************************************************** 
    //How to find the just saved id_token using incoming parameter, arg 
    //***************************************************************** 

    return Task.FromResult(0); 
} 

UPDATE 2

代わりのSecurityTokenValidated、私はAuthorizationCodeReceivedを試してみましたが、それがすべてで呼び出さなっていません。ここで説明したように、私のredirect url does have an ending slashも同様です。

すべてのアイデア?

答えて

1

AAD B2CをサポートするASP.NET OpenID Connectミドルウェアは、ブラウザからのクッキー認証に依存するように構築されています。ヘッダーなどのトークンやウェブページを保護するためのトークンは受け付けません。だから、古典的な方法であなたのWebアプリケーションからHTMLを提供したい場合は、Webアプリケーションへの要求を認証するためにCookieを使用する必要があります。

ウェブアプリケーションに認証するためにCookieを使用していても、ブラウザ内にストアトークンを確実に取得し、Web APIにアクセスすることができます。

  • OpenID Connectミドルウェアを使用して初期ログインを行い、サンプルに記載されているようにサーバー側からフローを開始します。フローが完了すると、ミドルウェアは結果として得られたid_tokenを検証し、将来のリクエストのためにブラウザにクッキーをドロップします。ミドルウェアにid_tokenを保存して、後で使用するために、hereというコード行を使用するように指示することができます。その後、何とかそれは、お使いのブラウザまでのキャッシュをそのid_tokenを渡すと、APIへのリクエストをするためにそれを使用することができます。
  • 他のパターンが逆です。 B2Cの文書から単一ページアプリのパターンを使用して、JavaScriptからログインを開始することによって開始します。結果のid_tokensをブラウザにキャッシュし、それらを使用してAPI呼び出しを行います。しかし、ログインが完了したら、体内にid_tokenのWebアプリケーションにリクエストを送信し、OpenID Connectミドルウェアがリクエストを処理してセッションCookieを発行するようにトリガーすることができます。あなたはその要求の形式を知りたい場合は、私は定期的にサーバー側のOpenID接続フローを調べお勧めします。
0

は自分の質問への答えを発見し、今後の参考のためここに加えます。

id_tokenには、SecurityTokenValidated通知を呼び出すことでアクセスできます。コードサンプルは以下の通りです。

private Task OnSecurityTokenValidated(
     SecurityTokenValidatedNotification<OpenIdConnectMessage, 
         OpenIdConnectAuthenticationOptions> arg) 
{ 
    //Id Token can be retrieved as below. 
    //************************************** 
    var token = arg.ProtocolMessage.IdToken; 

    return Task.FromResult(0); 
} 

ただし、これをブラウザのクッキーに直接保存するとセキュリティが保護されない場合があります。

+0

あなたはもう少し説明していただけますか?このメソッドはいつ実行されますか?どのようにソリューションを実装していますか? – zuckerthoben

+0

これらはすべて、Webアプリケーション(APIではなく)内のApp_StartディレクトリにあるStartup.Auth.csのStartupクラス内で実行されます。まず、Web AppとAPIの両方の認証を並べ替える必要があります。サンプルプロジェクトのために、元の投稿にリンクがあります。 – Kaf

関連する問題