2012-09-20 229 views
6

目前,我有一個銷售小部件的MVC Web應用程序。用戶使用表單身份驗證登錄到我們的系統,然後可以根據他們所屬的組執行各種功能(即下訂單,查看訂單,取消訂單等)。.NET WebApi身份驗證

我們的任務是編寫一個Api,使第三方能夠在我們的系統中創建和查看訂單。每個第三方都將擁有自己的用戶名,並且僅限於基於所屬組的某些API方法。

我們正在研究使用Web API作爲提供api的機制。我們還希望能夠從我們的MVC Web應用程序中使用此API。不幸的是,我們遇到了有關Web Api驗證的問題。使用DelegatingHandler,我們已經通過SSL爲我們的WebApi實現了基本認證。這對我們的第三方非常有用。但是,當試圖從我們的MVC應用程序中使用Api時,我們得到401訪問被拒絕的錯誤,因爲用戶使用Forms身份驗證在MVC應用程序中進行了身份驗證,但是我們無法將這些憑據傳遞到Web Api。有沒有辦法將Forms Auth憑證從我們的MVC應用程序傳遞到我們的Web api應用程序?

IIS安裝 網頁命名WidgetStore有兩個Web應用程序

  • WidgetStore \ UI -uses窗體身份驗證
  • WidgetStore \ API - 使用基本身份驗證
+0

爲了解決您的表單/基本身份驗證問題,我建議您閱讀Dominick Baier的這篇精彩文章:[Forms/Basic auth claims transformation](http://leastprivilege.com/2012/10/24/擴展到Web-apimvc-formsbasic-auth-sample-claims-transformation-and-ajax /) – Swell

回答

9

有沒有一種辦法將Forms Auth證書從我們的MVC應用程序傳遞到我們的Web api應用程序?

當然,讓我們舉個例子以下MVC控制器操作調用Web API:

[Authorize] 
public ActionResult CallWebApi() 
{ 
    var baseAddress = new Uri("https://example.com"); 
    var cookieContainer = new CookieContainer(); 
    using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer }) 
    using (var client = new HttpClient(handler) { BaseAddress = baseAddress }) 
    { 
     var authCookie = Request.Cookies[FormsAuthentication.FormsCookieName].Value; 
     cookieContainer.Add(baseAddress, new Cookie(FormsAuthentication.FormsCookieName, authCookie)); 
     var result = client.GetAsync("/api/values").Result; 
     result.EnsureSuccessStatusCode(); 

     // now you can read the result.Content ... 
    } 
} 

這假定您已經也使窗體身份驗證在Web API項目的web.config文件和該cookie名稱與您在MVC項目中使用的名稱相同。

+0

感謝您的回覆。但是,如果我在Web API項目的web.config中啓用FormsAuthentication,則第三方將無法進行身份驗證。他們使用BASIC身份驗證連接到WebApi,它將不再起作用。第三方將沒有FormsAuth cookie – user1686249

+0

但是,基本表單身份驗證委託處理程序的外觀如何?如果看起來像這樣,你將不會遇到啓用表單身份驗證的問題:http://stackoverflow.com/a/11536349/29407 –