2013-01-03 40 views
3

我使用下面的技術在開發一個網站:MVC 4應用,EF和Web API結構和用戶認證

MVC 4 EF 5 網絡API 未來 - 可能的Windows Phone/Windows 8的應用程序。

我正在使用Web API,因此我開發了一個可以在其他客戶端上使用的API。

但是,每次向API發出請求時,我都需要授權用戶。我最初的想法是通過HTTP頭進行。不過,我只是想知道,如果我要開發一個電話/贏8應用程序,是否應該使用MVC控制器而不是Web API的MVC應用程序,並創建一個RESTful API,再次用戶需要進行身份驗證。所以最初的問題依然存在。

什麼是人們的想法?任何人都可以指導我如何通過HTTP Header安全地傳遞經過驗證的用戶詳細信息的教程,這也是一步一步的教程,因爲我從頭開始學習,需要了解它。

+0

這是你在找什麼? http://stackoverflow.com/questions/11014953/asp-net-mvc-4-webapi-authentication – user1797792

回答

1

我使用基本身份驗證來傳遞憑據進行授權。這將憑據放在標題中。通過使用jQuery ajax函數的事件處理程序之前的beforeSend來做到這一點非常簡單。這裏是一個如何做到這一點的例子。

getAuthorizationHeader = function (username, password) { 
     var authType; 
     var up = $.base64.encode(username + ":" + password); 
     authType = "Basic " + up; 
    }; 
    return authType; 
}; 

    $.ajax({ 
     url: _url, 
     data: _data, 
     type: _type, 
     beforeSend: function (xhr) { 
      xhr.setRequestHeader("Authorization", getAuthorizationHeader(username, password)); 
     }, 
     success: ajaxSuccessHandler, 
     error: ajaxErrHandler 
    }); 

這將編碼在標題中發送的用戶名/密碼。請注意,由於編碼很容易解碼,因此這不足以依賴編碼。您仍希望使用HTTPS/SSL來確保通過線路發送的信息是安全的。

在Web API方面,您可以自定義AuthorizeAttribute從頭獲取憑證,解碼它們並執行授權過程。 Web API使用了與控制器相對的獨立的AuthorizeAttribute。在創建自定義AuthorizeAttribute時,請務必使用System.Web.Http.AuthorizeAttribute作爲您的基類。他們有不同的行爲。控制器將要重定向到登錄頁面,而Web API的則返回指示成功或失敗的HTTP代碼。如果授權無法區分由於授權導致的失敗而不是身份驗證,則我會返回Forbidden的HTTP代碼,以便客戶端可以做出相應的反應。

以下是從標題中獲取證書的示例方法,該證書可用於自定義AuthorizeAttribute

private bool GetUserNameAndPassword(HttpActionContext actionContext, out string username, out string password) 
    { 
     bool gotIt = false; 
     username = string.Empty; 
     password = string.Empty; 
     IEnumerable<string> headerVals; 
     if (actionContext.Request.Headers.TryGetValues("Authorization", out headerVals)) 
     { 
      try 
      { 
       string authHeader = headerVals.FirstOrDefault(); 
       char[] delims = { ' ' }; 
       string[] authHeaderTokens = authHeader.Split(new char[] { ' ' }); 
       if (authHeaderTokens[0].Contains("Basic")) 
       { 
        string decodedStr = SecurityHelper.DecodeFrom64(authHeaderTokens[1]); 
        string[] unpw = decodedStr.Split(new char[] { ':' }); 
        username = unpw[0]; 
        password = unpw[1]; 
       } 
       gotIt = true; 
      } 
      catch { gotIt = false; } 
     } 

     return gotIt; 
    } 

這裏是解碼在這個方法中使用的標題數據的代碼。

public static string DecodeFrom64(string encodedData) 
    { 

     byte[] encodedDataAsBytes 

      = System.Convert.FromBase64String(encodedData); 

     string returnValue = 

      System.Text.Encoding.ASCII.GetString(encodedDataAsBytes); 

     return returnValue; 

    } 

一旦你的用戶名和密碼,您就可以執行授權程序及相應的HTTP代碼返回給客戶端處理。

更新2013年3月8日

我寫了blog post that goes into more details on how to implement this with SimpleMembership,爲MVC 4互聯網應用程序的默認成員資格提供。它還包含一個可下載的VS 2012項目來實現這一點。

+0

感謝您的這一點,如果我想檢查每個服務器調用,用戶認證 - 他們不是每次都要提供密碼......? – dotnethaggis

+0

如果客戶端支持cookies,您可以使用它們。當您驗證用戶設置cookie時。然後在你的認證/授權邏輯中,如果憑證不在標題中,你可以嘗試使用cookie進行認證。有關在SimpleMembership提供程序中使用此功能的更多詳細信息,請參見此處[http://kevin-junghans.blogspot.com/2013/02/mixing-forms-authentication-basic.html] –

+0

非常好 - 非常感謝Kevin。我會在適當的時候閱讀。 – dotnethaggis