2014-12-02 148 views
13

基本上,我創建了我的第一個WCF Web服務,並且正在尋求實現自定義身份驗證和授權。身份驗證似乎運行良好,但我希望能夠使用自定義授權來存儲角色和權限。WCF自定義授權

我的驗證是通過覆蓋UserNamePasswordValidator並使用Validate方法完成的。

Validate(string UserName, string password) 

現在,我已經嘗試使用IAuthorizationPolicy接口

public class AuthorizationPolicy : IAuthorizationPolicy 
{ 
    private string _id; 

    public string Id 
    { 
     get { return this._id; } 
    } 

    public ClaimSet Issuer 
    { 
     get { return ClaimSet.System; } 
    } 

    public AuthorizationPolicy() 
    { 
     _id = Guid.NewGuid().ToString(); 
    } 

    public bool Evaluate(EvaluationContext context, ref object state) 
    { 
     IIdentity client = GetClientIdentity(context); 
     context.Properties["Principal"] = new CustomPrincipal(client); 

     return true; 
    } 

    private IIdentity GetClientIdentity(EvaluationContext evaluationContext) 
    { 
     object obj; 
     if (!evaluationContext.Properties.TryGetValue("Identities", out obj)) 
      throw new Exception("No Identity found"); 

     IList<IIdentity> identities = obj as IList<IIdentity>; 
     if (identities == null || identities.Count <= 0) 
      throw new Exception("No Identity found"); 

     return identities[0]; 
    } 
} 

實施的授權,我已經使用IPrincipal接口也實現了CustomPrincipal

public class CustomPrincipal : IPrincipal 
{ 
    IIdentity _identity; 
    string[] _roles; 

    public CustomPrincipal(IIdentity identity) 
    { 
     _identity = identity; 
    } 

    public static CustomPrincipal Current 
    { 
     get 
     { 
      return Thread.CurrentPrincipal as CustomPrincipal; 
     } 
    } 

    public IIdentity Identity 
    { 
     get { return _identity; } 
    } 

    public string[] Roles 
    { 
     get 
     { 
      if (_roles == null) 
      { 
       EnsureRoles(); 
      } 

      return _roles; 
     } 
    } 

    public bool IsInRole(string role) 
    { 
     EnsureRoles(); 

     return _roles.Contains(role); 
    } 

    protected virtual void EnsureRoles() 
    { 
     UserManager userManager = new UserManager(); 
     int userPermissions = userManager.UserPermissions(_identity.Name); 

     if (userPermissions == 1) 
      _roles = new string[1] { "ADMIN" }; 
     else 
      _roles = new string[1] { "USER" }; 
    } 
} 

我App.Config中按要求進行了更新,並在AuthorizationPolicyEvaluate方法有望被調用。

但是,這是我卡住的地方。我如何去實現這裏的角色和權限?

回答

5

我建議你選擇一個Message Inspector

邏輯將是如下:

  1. 客戶端將有一個消息檢查,將設置所需的標題爲每個請求。
  2. 服務器端消息檢查器將攔截該請求,然後讀取標頭並執行身份驗證和授權。
  3. 您可以擁有一些服務,如用戶和角色服務,可以在服務器中調用以驗證標頭中的憑據並設置該請求的標識。
  4. 這些服務將通過DAL訪問商店,並且處於inproc模式。
3

你可以參考Authentication and Authorization with ASP.NET Identity 2.0 for WCF Services

基本上你將有3個級別,根據這篇文章,以考慮:

  1. System.IdentityModel和System.Security.Principal

  2. Asp.net Identity 2.0,如果您想使用與MVC應用程序共享的開箱即用上下文;或者你使用你的自定義數據庫。

  3. 政策,如果你想安全策略的細粒度控制