2014-07-01 25 views
2

我相信我理解了sessionless /無狀態REST的基礎知識,但是我在Asp.Net Web Api 2中實現時遇到了問題,因爲我之前沒有使用它。我已經建立了像這樣使用自定義System.Web.Http.AuthorizeAttribute的ApiControllers。Web Api 2無狀態用戶

public class ApiAuthorizeAttribute : System.Web.Http.AuthorizeAttribute 
{ 
    public override void OnAuthorization(HttpActionContext actionContext) 
    { 
      if (actionContext.Request.Headers.Authorization != null) 
      { 
       //Set identity?? 
       return; 
      } 
      actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized); 
    } 
} 

我有一個包含用戶數據庫,我需要用它們來獲得特權,GET/POST/PUT /刪除的東西,但不想使用一個會話。我從來沒有使用過asp.net身份,所以我不熟悉它的特性和功能。

我的實現想法是使用用戶憑據或api祕密簽名來驗證和獲取每個請求的用戶權限。問題是,通過使用AuthorizeAttribute或類似的東西,如果他們的憑證是正確的,那麼如何在一個請求期間向控制器發送用戶信息?

更新: 正在使用this.User(ApiController.User)會話基於或可以用於該單個請求。如果是這樣,那麼如何設置它

回答

1

它看起來像使用的IPrincipal和設置HttpContext.Current.User將允許ApiControllers通過使用

this.User 

與網頁API訪問該用戶沒有進入會議

public override void OnAuthorization(HttpActionContext actionContext) 
{ 
     if (actionContext.Request.Headers.Authorization != null) 
     { 
      //Check user credentials/token here 
      //Get internal user 

      IPrincipal principal = new MyOwnCustomPrincipal(internalUser); 
      HttpContext.Current.User = principal; 
      return; 
     } 
     actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized); 
} 
1

您可以使用HttpContext.Items來保存當前請求的用戶數據。 設置基於驗證頭身份後,你可以有

System.Web.HttpContext.Current.Items["userdata"]=userDataObject, 

另一種方法是編寫自己的動作過濾器進行身份驗證(但需要悉心照顧)和數據傳遞到控制器。

public class MyAuthAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     //do authorization here  

     base.OnActionExecuting(filterContext); 

     // Create object parameter. 
     filterContext.ActionParameters["userdata"] = new User("John", "Smith"); 

    } 
} 

然後在控制器

[MyAuthAttribute] 
ActionResult SomeAction(User userdata) //this will have user data 
{ 

} 
+0

這似乎是一個極端的放置在restapi的每一條路線。在Web Api控制器中執行操作時,是基於會話的「this.User」還是可以爲該請求設置和使用 – Gekctek

+0

您也可以選擇CustomPrincipal方法,將用戶數據包裹在主體中。 –