如何将自定义IAuthorizationPolicy中的声明传递给当前的ServiceSecurityContext

时间:2016-02-03 12:16:38

标签: c# wcf security

我有自定义安全令牌和自定义IAuthorizationPolicy,如下所示:

public class TestAuthorizationPolicy : IAuthorizationPolicy
{
    public TestAuthorizationPolicy(string name, string someData, string moreData)
    {
        this.Name = name;
        this.SomeData = someData;
        this.MoreData = moreData;

        var claims = new[]
        {
            new Claim("http://text.example.com/Claims/Name", this.Name, Rights.Identity),
            new Claim("http://text.example.com/Claims/SomeData", this.SomeData, Rights.PossessProperty),
            new Claim("http://text.example.com/Claims/MoreData", this.MoreData, Rights.PossessProperty),
        };

        this.Id = SecUid.Create().ID;
        this.Issuance = new DefaultClaimSet(claims);
        this.Issuer = this.Issuance.Issuer;
    }

    private string Name { get; set; }
    private string SomeData { get; set; }
    private string MoreData { get; set; }

    private ClaimSet Issuance { get; set; }

    public string Id { get; private set; }

    public ClaimSet Issuer { get; private set; }

    public bool Evaluate(EvaluationContext evaluationContext, ref object state)
    {
        evaluationContext.AddClaimSet(this, this.Issuance);

        var identity = new GenericIdentity(this.Name, "Custom");

        evaluationContext.Properties["Identities"] = new IIdentity[] { identity };
        evaluationContext.Properties["Principal"] = new GenericPrincipal(identity, new string[0]);

        return true;
    }
}

服务方法具有我的CAS属性,该属性反过来返回我的IPermission,这确保当前安全上下文具有由策略提供的执行操作所需的声明。

大多数情况下这很好用。但是在一些罕见的CAS执行不同的线程,然后执行我的策略的线程。因此,在这种情况下,ServiceSecurityContext为空。没有任何授权政策,没有任何声明,没有身份,没有。

因此,令牌被服务器接收,成功解析,安全数据被设置并且......丢失了?为什么会这样?怎么处理呢?

还试图摆脱CAS并在服务方法中进行所有检查。同样的问题 - 策略和服务的不同线程导致空的安全上下文。

0 个答案:

没有答案