WCF 自定义授权

本文关键字:授权 自定义 WCF | 更新日期: 2023-09-27 18:32:55

基本上,我正在创建我的第一个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];
    }
}

我还使用 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" };
    }
}

我的应用配置已根据需要更新,并且按预期调用了AuthorizationPolicy中的Evaluate方法。

然而,这就是我卡住的地方。如何从此处实现角色和权限?

WCF 自定义授权

我建议您选择消息检查器。

逻辑如下:

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

您可以参考 WCF 服务的 ASP.NET 标识 2.0 的身份验证和授权

根据本文,基本上您将有 3 个级别需要考虑:

  1. System.IdentityModel 和 System.Security.Principal

  2. 如果要使用与 MVC 应用程序共享的开箱即用上下文,Asp.net Identity 2.0;或者使用自定义数据库。

  3. 策略(如果需要对安全策略进行细粒度控制)