2015-11-13 82 views
1

,試圖對身份驗證後ADFS提取承載令牌被打......如何從WsFederationAuthentication獲得承載令牌發送到API

我將接受一個承載令牌並驗證它針對ADFS的API。

我有一個Web窗體(.net 4.5.1)應用程序,我正在修改使用ADFS 3.0來實現SSO身份驗證。到目前爲止,它對ADFS服務器進行了正確的身份驗證(呈現給ADFS登錄頁面並登錄)。

我的問題是,我現在想讓WebForms應用程序使用持票人標記調用我的Web API,我希望在ADFS返回的響應中存在某處,但是它在哪裏以及如何檢索它?

我嘗試使用SecurityTokenValidated和SecurityTokenReceived WsFederationAuthenticationNotifications事件,如下:

public void ConfigureAuth(IAppBuilder app) 
     { 
      app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType); 

      app.UseCookieAuthentication(new CookieAuthenticationOptions()); 

      app.UseWsFederationAuthentication(
       new WsFederationAuthenticationOptions 
       { 
        AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType, // "WS-Fed Auth (Primary)", 
        Wtrealm = realm, 
        MetadataAddress = metadata, 
        Notifications = new WsFederationAuthenticationNotifications 
        { 
         AuthenticationFailed = context => 
         { 
          context.HandleResponse(); 
          context.Response.Redirect("Home/Error?message=" + context.Exception.Message); 
          return Task.FromResult(0); 
         }, 

         SecurityTokenValidated = token => 
          { 
           Token = token.AuthenticationTicket.ToString(); 
           return Task.FromResult(0); 
          }, 

         SecurityTokenReceived = token => 
         { 
          Token = token.ToString(); 
          return Task.FromResult(0); 
         } 
        } 
       }); 
} 

但我無法找到令牌由事件返回的對象的任何地方...... 我在想什麼?

感謝您的幫助。

回答

1

您作爲Web登錄的一部分接收到的令牌不適合調用Web API,原因有兩個:A)令牌的受衆是Webform應用程序,而Web API只應接受令牌受衆對應於Web API - 否則會在中間攻擊時向您提供人員幫助。B)ADFS獲得的令牌是SAML令牌,可能相當大,因此不適合包含在HTTP標頭中(規範包括用於調用web API的不記名令牌的方式)。 如果您決定忽略上述內容並無論如何都使用該標記 - 在Acquiring an Access token by using JWT used for AzureBearerAuthentication中,您可以找到提取傳入標記位所需的代碼。它適用於openid connect和oauth中間件。

+0

感謝您的幫助,但我很困惑。我首先測試了一個Windows客戶端,它對ADFS進行了身份驗證,然後將它的不記名令牌發送給我的API,然後使用OWIN對它進行重新驗證,這似乎是根據示例進行驗證的方法......該方法需要更改當WebForms應用程序替換Windows客戶端時正確的事情? (我希望我的API不必關心叫什麼) – zukanta

+0

API確實不在乎。不同之處在於,在Windows客戶端中,您獲得了一個專門用於API的令牌,使用Web應用程序(無論是表單還是mvc)都嘗試爲API重新使用您獲得的用於登錄Web應用程序的令牌。代幣是不可替代的,它們就像銀行支票 - 爲我寫的一張支票不能兌現,反之亦然 – vibronet

+0

維托裏奧,我是你工作的忠實粉絲。非常高興你花時間來回答我的問題。現在,我在我的研究和許多其他許多文章中查看了許多文章,但無法找到內部部署ADFS/webforms/WCF API(本身不是Web API)的示例...如果我不應該發送從我的Web應用程序到我的API的令牌,API應如何驗證其調用者? – zukanta