WCF自定义授权

时间:2014-12-02 08:58:20

标签: c# wcf authorization

基本上,我正在创建我的第一个WCF Web服务,并且我正在寻求实现自定义身份验证和授权。身份验证似乎运行良好,但我希望能够使用自定义授权存储角色和权限。

我的身份验证是通过覆盖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];
    }
}

我也使用CustomPrincipal界面实现了IPrincipal

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已根据需要进行了更新,Evaluate中的AuthorizationPolicy方法按预期调用。

但是,这就是我被困的地方。如何从这里开始实现角色和权限?

2 个答案:

答案 0 :(得分:5)

我建议您选择Message Inspector

逻辑如下:

  1. 客户端将有一个消息检查器,它将为每个请求设置所需的标头。
  2. 服务器端消息检查器将拦截请求,然后读取标头并执行身份验证和授权。
  3. 您可以使用一些服务,例如可以在服务器中调用的用户和角色服务,以验证标头中的凭据并为该请求设置标识。
  4. 这些服务将通过DAL访问商店,并处于inproc模式。

答案 1 :(得分: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. 策略是否需要对安全策略进行细粒度控制