2013-04-23 62 views
0

我目前有一個ASP.NET MVC 4網站,其中成員有一個帳戶,可以使用Facebook和我自己的登錄表單登錄。然後我使用FormsAuthentication。WebAPI的安全方法

我接下來想要構建一個API,使用WebAPI並將我的一些功能展示給我正在計劃構建的移動客戶端。

我沒有任何計劃讓別人使用我的API,所以這只是爲我建立的客戶端。

我該如何去實現WebAPI的安全性?我是否應該使用令牌系統,讓我可以在客戶端上擁有登錄表單,接收憑證並登錄,並返回一個令牌,並在每次調用時發送回服務器?

我應該在服務器上實現oAuth嗎?

+0

請參閱http://stackoverflow.com/questions/319530/restful-authentication – Yaur 2013-04-23 20:10:15

回答

0

嘗試完全RESTful:使用HTTP的內置身份驗證系統,其中身份驗證信息由客戶端在每個請求中提供。只要您使用SSL,您也可以使用HTTP基本認證,而不存在任何安全問題,否則HTTP摘要也足夠安全以實現此目的。

您將需要爲ASP.NET實現您自己的HTTP基本身份驗證提供程序,幸運的是它很容易(也很有趣!)。

它還擊敗了其他需要使用querystring參數簽名的URI的系統,這個參數很醜陋,可愛可靠,或者帶有一個令牌(通常作爲cookie傳遞)。

0

關於如何在休息時間進行身份驗證的聖戰,您可以使用表單身份驗證。如果您還使用來自同一站點/域的Web界面,並且您的身份驗證功能得到了充分考慮,則這非常方便和簡單。

你需要一個基類的API控制器

public class MyApiControllerBase : ApiController 
{ 
    public MySecurityContextType SecurityContext { get; set; } 
} 

一個ActionFilterAttribute

public class AuthenticationContextAttribute : System.Web.Http.Filters.ActionFilterAttribute 
{ 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     MyApiControllerBase controller = actionContext.ControllerContext.Controller as MyApiControllerBase ; 
     if (controller != null) 
     { 

      var context = ((HttpContextBase)controller.Request.Properties["MS_HttpContext"]); 

      HttpCookie cookie = context.Request.Cookies[FormsAuthentication.FormsCookieName]; 
      FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(cookie.Value); 

      controller.SecurityContext= ParseFormsAuthenticationTicket(ticket); 
     } 
    } 
} 

和代碼首先創建了票。

LogIn(HttpRequestBase httpRequest, string userName, string password) 
{ 
    var context = DoLoginLogic(userName,password); 
    FormsAuthentication.SetAuthCookie(context, usePersistentCookies); 
} 

授權顯然需要在控制器方法中完成。

+0

您可以通過向控制器操作方法添加屬性來簡化授權實現。 – Dai 2013-04-24 00:37:31

+0

這真的取決於您的授權方案。如果您需要授權級別(例如管理員與非管理員),當然。如果您需要對象級授權,使用動作過濾器很難簡化它。 – Yaur 2013-04-26 17:07:56