2014-05-02 80 views
1

我正在使用Amazon SimpleDB作爲數據存儲的項目。在這個應用程序中,用戶可以在運行時創建角色。在創建角色時,用戶可以爲特定功能提供讀/寫/更新權限。如何在ASP.Net中實現基於自定義角色的授權MVC

我試過的代碼;

using System; 
using System.Web.Http; 
using System.Web.Http.Controllers; 
using System.Web.Http.Filters; 


[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] 
    public class MyAuthorization : ActionFilterAttribute 
    { 
     public string Model { get; set; } 
     public string Action { get; set; } 

     public override void OnActionExecuting(HttpActionContext filterContext) 
     { 
      //My code will go here 
      base.OnActionExecuting(filterContext); 
     } 
    } 

在Web API控制器中,我寫成了;

// GET api/values 
     [MyAuthorization(Action = "Edit", Model = "Rack")] 
     public IEnumerable<string> Get() 
     { 
      return new string[] { "value1", "value2" }; 
     } 

現在OnActionExecuting,我想取行動和模型屬性這是我在上行動APIController方法中指定。

如何通過代碼處理它,因爲在設計時角色名稱和權限未知。

回答

3

我假定您將在某個控制器中實現的每個功能,以及每個操作方法指定您正在執行的操作類型(例如讀取,寫入等)。

如果我的假設是正確的,那麼您可能必須首先像下面那樣擴展AuthorzeAttribute ASP.NET MVC框架。

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] 
public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    public string Operation; 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     base.OnAuthorization(filterContext); 

     //Get the User Id from the session 
     // Get Role associated with the user (probably from database) 
     // get the permission associated with the role (like Read, write etc) 
     // Let assume the retrieved operations are in the form of list of strings 
     List<string> retrievedOperations =RetrieveRoleOperations(userId)   

     if (!retrievedOperations.Contains(Operation) 
     { 
     filterContext.Result = new HttpUnauthorizedResult(); 
     } 
    } 

}

創建這個類之後,你有必要的行動方法,比如下面指定擴展的授權過濾器。

Class MyFeatureController:Controller 
{ 
    [MyCustomAuthorize(Operation="Read")] 
    public ActionResult MyReadMethod() 
    { 
     // 
    } 
} 

我希望這能解決您的問題。

+0

你能幫我一下,如何用WebAPI做到這一點? –

+0

您已經在「MyAuthorization」過濾器上指定了一些常量值,並且可以通過使用this.Action和this.Model在類中訪問相同的值。但看起來你正在尋找更多的東西。不知道你到底在找什麼。你想訪問在控制器中實例化的模型嗎? – Sankaran