2017-08-19 16 views
0

我有一個允許編輯3D地圖的內容管理系統。我要授權每個用戶的基礎上,使得用戶只能放置/刪除/獲得一定的azazaz如果:對Angular2/4和Web API中具有特定ID的資源的Auth0授權2

  • 用戶擁有地圖
  • 用戶是管理員

我已經看過示波器,但這些感覺就像是錯誤的方法,因爲「編輯:地圖」的範圍不能不同,只有當用戶可以編輯任何地圖時,才能區分MapIds。

另一種方法是使用auth0規則是這樣的:

function (user, context, callback) {  

    var allAuthorizedMapIdsForUser = someExternalDbCall(); 

    context.idToken['https://authorizedMapids.com'] = allAuthorizedMapIdsForUser; 

    callback(null, user, context); 
} 

,但我對不能確定如何實現和ASP NET的Web API 2.

第三,可能在使用最冗餘的辦法是實現每個API方法手動授權:

[HttpGet] 
    public async Task<IHttpActionResult> GetMap(int mapId) 
    { 
     var userId = //somehow get userId 

          // Checks some DB-table if user has MapId or is admin 
     bool isAuthorized = this.IsUserAuthorizedForMapId(mapId, userId); 

     if (!isAuthorized) 
      return Unauthorized(); 

     // ..perform GET 
    } 

任何想法?

回答

0

什麼,我可以建議你是創建一個自定義[授權]裝修AspNetIdentiy至極不是基於角色的,但User-Based ...

例如(假設你使用ASPNET身份進行的WebAPI這樣:http://bitoftech.net/2015/01/21/asp-net-identity-2-with-asp-net-web-api-2-accounts-management/ ...或任何其他教程)

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)] 
public class CustomAuthorizeAttribute : AuthorizeAttribute 
{ 
    /// <summary> 
    /// aallowed ids you opass external or if you prefer you can deo a query in the AuthorizeCore method 
    /// </summary> 
    public string IDS { get; set; } 

    /// <summary> 
    /// Checks to see if the user is authenticated and has the 
    /// correct role to access a particular view. 
    /// </summary> 
    /// <param name="httpContext"></param> 
    /// <returns></returns> 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (httpContext == null) 
      throw new ArgumentNullException("httpContext"); 

     if (!httpContext.User.Identity.IsAuthenticated) 
      return false; 

      var userId = User.Identity.GetUserId();//get current userid 
      ApplicationUserManager UserManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();//get usermanage 

      var IDSAllowed = IDS.Split(",").ToList(); 

      bool isAuthorized = IDSAllowed.Any()? IDSAllowed.Contains(userId) : false; //if you prefer you can deo a query on DB to retrive allowed IDS 

     if (!isAuthorized) 
      return Unauthorized(); 

     return true; 
    } 

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if (filterContext == null) 
      throw new ArgumentNullException("filterContext"); 

     filterContext.Result = new ViewResult { ViewName = "NotAuthorized" }; 
    } 
} 

,然後你可以用它在你的控制器作爲

[CustomAuthorize(IDS = "1,2,9")] 
    [HttpGet] 
    public async Task<IHttpActionResult> GetMap(int mapId) 
    { 

    } 

像這樣的東西..希望它可以幫助你!

+0

感謝您的回覆。如果ID是事先知道的,這將工作,但我正在尋找更動態的方法,因爲用戶可以自己創建映射,因此需要在運行時/方法調用時獲取ID。也許我正在接近這個錯誤的方式。我擔心的是用戶可以惡意更改Angular 2前端的地圖ID,因此可以刪除他們想要的任何地圖。我估計我應該考慮前端安全性,而不是在加載任何地圖之前進行API調用,以檢查用戶是否在JWT令牌中由用戶ID在該特定地圖上授權。 –