1

場景: Web應用程序和Web API都需要從服務器端進行身份驗證和保護。使用Azure AD對Web應用程序和Web API進行基於令牌的身份驗證B2C

要求: Web應用程序正在爲瀏覽器提供內容,瀏覽器應直接調用Web API(即Browser to API)。

問題: 是否可以使用標記驗證Web應用程序和API?

任何示例代碼或清晰的方向將不勝感激。


通常Web應用程序使用cookie認證和API使用tokens.There認證可here一些樣本項目,但他們要麼是瀏覽器API(SPA基於令牌)或服務器端Web應用程序調用從服務器的API服務器。

UPDATE 1

應用被保存TokenValidationParameters和該應用控制器內使用bootstrapContext.Token抓住服務器到服務器的通信。

根據@dstrockis,我試圖在驗證結束後不久(在應用程序控制器內)從Web App抓取id_token

我在Startup類中使用SecurityTokenValidated調用者OpenIdConnectAuthenticationOptions.NotificationsSecurityTokenValidated收到SecurityTokenValidatedNotification<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); 
} 

更新2

相反的SecurityTokenValidated,我想AuthorizationCodeReceived和它沒有得到被調用。正如這裏所討論的,我的redirect url does have an ending slash也是如此。

任何想法?

回答

1

我們的ASP.NET OpenID Connect中間件支持AAD B2C,它的構建依賴於來自瀏覽器的cookie認證。它不接受令牌或類似的東西來保護網頁。所以我想說,如果你想以經典的方式從你的web應用程序提供HTML,你需要使用cookie來驗證對web應用程序的請求。

在瀏覽器中,您絕對可以獲得&商店標記,並使用這些標記訪問您的Web API,即使您使用Cookie對Web應用進行身份驗證。我推薦兩種模式:

  • 使用OpenID Connect Middleware執行初始登錄,按照示例中所述從服務器端啓動流程。流程完成後,中間件將驗證生成的id_token並在瀏覽器中刪除Cookie以備將來使用。您可以通過使用編寫的代碼行here來指示中間件保存id_token供以後使用。然後,您可以以某種方式將id_token傳遞給您的瀏覽器,對其進行緩存,然後使用它向API發出請求。
  • 其他模式是逆。首先使用來自B2C文檔的單頁應用程序模式啓動來自JavaScript的登錄。在瀏覽器中緩存生成的id_tokens,並使用它們進行API調用。但是,當登錄完成時,您可以將正文中id_token的請求發送到您的Web應用程序,從而觸發OpenID Connect中間件處理請求併發出會話Cookie。如果你想知道這個請求的格式,我建議檢查一個普通的服務器端OpenID Connect流。
0

找到了我自己的問題的答案,並在這裏添加爲未來的參考。

驗證成功後,可以通過調用SecurityTokenValidated通知來訪問id_token。代碼示例如下。

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

    return Task.FromResult(0); 
} 

但是,直接將其保存到瀏覽器cookie中可能不安全。

+0

你能解釋一下多一點嗎?此方法何時執行?你如何實施解決方案? – zuckerthoben

+0

所有這些都在Web應用程序(而不是API)的App_Start目錄中的Startup.Auth.cs的Startup類中完成。您需要首先對Web App和API進行身份驗證。原始帖子中有一個鏈接,用於示例項目。 – Kaf

相關問題