2012-05-21 210 views
5

我被要求爲客戶創建一個API。在開始之前,我有一些問題。我決定使用ASP.NET Web API技術。我創建了我的第一個方法,它工作正常,我能夠以XML/Json格式返回一組產品的結果。問題是,任何訪問我的API的人都可以看到我的所有產品。我已經有了一個客戶數據庫,我怎樣才能使用它,以便在訪問我的API之前,他們必須設置一些憑據。ASP.NET Web API問題 - 授權/認證

的API應該是Web和桌面客戶端

一種方式我想這樣做的訪問,是他們通過他們的用戶名/密碼一起作爲參數,但這沒有似乎非常安全/右?例如:api/products/GetById/750?username=bob&pass=123

回答

7

你可以使用AuthorizeAttribute來裝飾你的控制器/行動。

[Authorize] 
public IEnumerable<Product> Get() {...} 

這可能會限制您的資源僅可用於已通過身份驗證的用戶。

實際的認證方法是另一回事。默認情況下,Web API使用基於cookie的ASP.NET表單身份驗證,如果直接從html + js Web客戶端使用api,那麼這很有用。另一方面,如果您的API要由桌面/移動應用程序或基於插件的Web客戶端使用,那麼使用HTTP基本身份驗證可能會更好,因爲您不必管理Cookie(請記住在此方案中使用SSL )。

您可能想看看我的博客文章http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-membership-provider/,其中顯示瞭如何提供使用ASP.NET成員身份和角色提供程序的http基本身份驗證。

+0

這很好,但客戶如何輸入他們的憑證才能獲得授權?我需要揭露一種方法嗎? – CallumVass

+0

這取決於您使用的客戶端平臺。例如使用.NET WebClient,您可能會設置WebClient.Credentials屬性。 –

3

絕對不是通過查詢字符串。

爲什麼不使用ASP.NET成員資格? MSDN

或者,您可以編寫自己的身份驗證,並在傳回產品列表之前檢查用戶是否具有適當的權限。

http://sixgun.wordpress.com/2012/02/29/asp-net-web-api-basic-authentication/

+0

啊,但是他們怎麼會在他們的憑據傳遞給會員提供/ Custom Authenticator在訪問我的API之前? – CallumVass

+1

@DarrenDavies沒有REST你不能,他使用的是Web API。 – mattytommo

+1

@BiffBaffBoff - 看看這個:http://sixgun.co.uk/blog/2012/02/29/asp-net-web-api-basic-authentication/ –

3
  • 你想舉辦一個SSL文件夾中的API。這將加密所有通信(與通過網絡發送您的信用卡號碼)

  • 您也可以加密URL所以它會這樣寫:

    api/products/GetById/750?u=828s388332e328e38&p=328e23e2i38324r423ur29834

    但是這代表因爲挑戰現在您必須同步客戶端使用的加密方法

  • 您還可以使用令牌,讓您的客戶端檢索具有到期日期的令牌。令牌過期(1小時或1天等)。那麼URL可以是這樣的:

    api/products/GetById/750?token=1241824123yxxcn2r348

  • 您也可以使用私有/公共密鑰: MSDN

+0

SSL用於加密通信,但與授權或認證無關,這與問題有關。 –

+1

雖然問題的標題是關於授權和身份驗證,但他擔心從客戶端傳遞證書。 SSL將有助於將風險降至最低。 –

0

使用用戶名/密碼組合很好,但不是傳遞查詢字符串,而是以更加標準化的方式(HTTP基本驗證)將其添加到消息的請求標頭中。下面是代碼會是什麼樣子:

HttpWebRequest req = (HttpWebRequest)WebRequest.Create(@"https://localhost:8010/api/Customer/1"); 
//Add a header to the request that contains our credentials 
//DO NOT HARDCODE IN PRODUCTION!! Pull credentials real-time from database or other store. 
string svcCredentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("user1"+ ":" + "test")); 
req.Headers.Add("Authorization", "Basic " + svcCredentials); 

您的問題時帶上「WCF」和「網絡API」,因此檢查證書服務器端是一個有點不同。然而,你基本上拉'授權'標題,並檢查憑據,看看用戶是否經過身份驗證和授權。如果它們未通過身份驗證,請返回HTTP 401消息。

對於WCF REST在IIS託管爲基礎的服務,你可以從我的博客中查看完整詳細的例子:

Using Basic Authentication In REST Based Services Hosted in IIS