5

我讀了很多博客文章和StackOverflow的答案,但我仍無法找到它使用基於聲明的身份驗證和授權一個真實的世界開源項目,這樣我可以得到一個關於如何實際實施這些的想法。基於聲明的授權

到目前爲止我所能找到的是Thinktecture.IdentityModelthis blog在示例網站上實現了基於索賠的授權。如果你們可以使用索賠來指出一些開源項目,那將會非常有幫助。

我感興趣的是如何使用數據庫檢索我的應用程序的聲明。

到目前爲止,我所嘗試的是,使用內存索賠存儲來模擬數據庫,我創建了這樣一個CustomClaimsTransformerCustomAuthorisationManager

public class CustomClaimsTransformer : ClaimsAuthenticationManager 
    { 
     public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal) 
     { 
      //validate name claim 
      string nameClaimValue = incomingPrincipal.Identity.Name; 

      return CreatePrincipal(nameClaimValue); 
     } 

     private ClaimsPrincipal CreatePrincipal(string userName) 
     { 
      int userId = ClaimStore.Users.First(u => u.Value == userName).Key; 
      var claims = ClaimStore.ClaimsSet.Where(c => c.Key == userId); 

      var claimsCollection = claims.Select(kp => kp.Value).ToList(); 

      return new ClaimsPrincipal(new ClaimsIdentity(claimsCollection, "Custom")); 
     } 
    } 

public class CustomAuthorisationManager : ClaimsAuthorizationManager 
    { 
     public override bool CheckAccess(AuthorizationContext context) 
     { 
      string resource = context.Resource.First().Value; 
      string action = context.Action.First().Value; 

      if (action == "Show" && resource == "Code") 
      { 
       bool likesJava = context.Principal.HasClaim(ClaimStore._httpMyclaimsUsers, "True"); 
       return likesJava; 
      } 
      else if (action == "Read" && resource == "Departments") 
      { 
       bool readDeps = context.Principal.HasClaim(ClaimStore._httpMyclaimsDepartments, "Read"); 
       return readDeps; 
      } 
      return false; 
     } 
    } 

如何在沒有太多IF條件的情況下在現實世界中實現這些?

+0

你是怎麼做到的?你能否提供答案 – Moes

回答

0

我終於成功地設計了我自己的系統,並使用現有的asp.net identity 2.0表格+我自己的幾個表格。

我要打電話給每一個領域 - CONTROLLER-ACTION三人在我的系統資源。包括WebAPI。區域本身就是一種資源。控制器本身是一種資源。行動本身就是一種資源。他們的任何組合,也是一種資源。我將使用反射自動生成系統本身的所有內容。

而且,我將使用相同的AspNetRoles表來存儲我的用戶組。用戶屬於一個或多個組(超級管理員,管理員,代理,客戶端等)。

使用現有的基於角色的模型與要求用戶組基於模型,我能得到它working.Super管理員都在上帝模式。他們可以創建較低級別的用戶/組/指派權限等

用戶可以擁有特殊權限。例如,代理組中的每個人都被拒絕訪問更新酒店,但也可以爲可能也是酒店所有者的特殊代理人提供特定訪問權限,以便只更新他們的酒店。

由於整個訪問控制系統運行在MVC區域控制器操作集上。沒有人最初無法訪問(包括超級管理員),我們逐漸定義組/用戶可以訪問的部分。我們通過索賠向超級管理員和管理員提供獨家訪問權限。無處不在的訪問被默認拒絕。

一旦我自動生成AREA-CONTROLLER-ACTION集,我讓用戶選擇哪個組可以訪問哪個項目。

當用戶登錄時,我獲得當前用戶有權訪問的所有資源並將它們存儲爲聲明。基於此,使用聲明身份驗證管理器,當用戶請求訪問某些資源時,我可以檢查他們的聲明並決定是否允許他們訪問。

foreach(var claim in permissionClaims) { 
    var parts = claim.Value.Split(new [] { 
     '|' 
    }, StringSplitOptions.None); 
    if (parts.Length == 3) { 
     //var httpMethod = parts[0]; 
     var action = parts[1]; 
     var api = parts[2]; 
     //Current.Log.Warn("Checking Access : " + req + " [action: " + action + "]"); 
     // is this request for a API action? 
     if (api.Contains("API")) { 
      // if so, req must be for a API action 
      if (req.Contains("Api") && action.Contains(req)) { 
       Log.Trace("User has access to API : " + req + " [action: " + action + "]"); 
       return true; 
      } 
     } else { 
      // this is for a MVC action 
      if (action.Contains(req)) { 
       Log.Trace("User has access to MVC : " + req + " [action: " + action + "]"); 
       return true; 
      } 
     } 
    } 
} 

我已經詳細解釋了方法here - ASP.NET MVC Fine Grained Identity & Access Control

+0

雖然這可能在理論上回答這個問題,[這將是更可取的](// meta.stackoverflow.com/q/8259)在這裏包括答案的基本部分,並提供該鏈接供參考。 –

2

試試下面的鏈接,這似乎是一個體面的解決方案

http://developers.axiomatics.com/blog/index/entry/custom-claims-based-authorization-in-net-using-axiomatics-pep-sdk-for-net.html

你也可以定義你的政策,並加載它

http://msdn.microsoft.com/en-us/library/system.security.claims.claimsauthorizationmanager.loadcustomconfiguration.aspx

如何:在實現如權利要求授權聲明感知ASP.NET應用程序使用WIF和ACS http://msdn.microsoft.com/en-us/library/gg185907.aspx

+0

謝謝你提供這些寶貴的資源。我已經看過每個Axiomatics SDK聽起來很有前途,但我不使用它。看起來我將不得不使用web.config或數據庫中定義的策略進行自定義實施。我只是不明白如何評估規則。 –

+0

(免責聲明 - 我爲Axiomatics工作)定製實施永遠不是一個好方法。有很多框架可以滿足各種授權 - 從簡單到複雜。微軟甚至有內置的基於聲明的authZ。實現你自己的方式絕對不是要走的路 –