如何在WCF中获取自定义用户名/密码

时间:2011-05-23 13:26:40

标签: wcf wcf-security

我在Message下的安全模式下使用clientCredentailType作为用户名。我创建了一个自定义用户名和密码验证程序类来验证用户名和密码。

我想使用这些凭据(用户名,密码)来授权服务中的不同操作。我想知道最新的存储用户名和密码以便重用的方法。我应该使用自定义验证器类将它们存储在静态变量中,以便它们可以在任何地方访问吗?

为什么我不能使用System.Threading.Thread.CurrentPrincipal.Identity.Name,我试图获取用户名,但它没有显示任何内容,我怎样才能获得密码?

由于 阿德南

2 个答案:

答案 0 :(得分:1)

仅处理和使用自定义验证程序中的凭据。如果凭据有效,请使用自定义授权策略为该用户准备具有一组角色的自定义主体,并使用PrincipalPermission属性修饰服务方法。

[PrincipalPermission(SecurityAction.Demand, Authenticated = true, Role = "ClearedForUsingFoo")]
public void Foo(string bar)
{
...


class AuthorizationPolicy : IAuthorizationPolicy
{
    public bool Evaluate(EvaluationContext evaluationContext, ref object state)
    {
        // get the authenticated client identity
        IIdentity identity = GetClientIdentity(evaluationContext);

        // set the custom principal
        evaluationContext.Properties["Principal"] = new CustomPrincipal(identity);

        return true;
    }

    public ClaimSet Issuer
    {
        get { throw new NotImplementedException(); }
    }

    public string Id
    {
        get { return "FooBarApp.AuthorizationPolicy"; }
    }

    private static 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];
    }
}

答案 1 :(得分:0)

线程的CurrentPrincipal属性是运行服务的Windows标识。您的服务以用户名/密码的形式接收客户端身份,并且与服务标识无关。 WCF支持impersonation and delegation但不使用您的服务正在使用的自定义身份方案。

question的接受答案可能就是您要找的内容。如果这不起作用,那么在代码中手动执行此操作会非常难看。