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

问题描述

|| 我在消息下的安全模式下使用clientCredentailType作为用户名。我创建了一个自定义用户名和密码验证器类,以验证用户名和密码。 我想使用这些凭据(用户名,密码)对服务中的不同操作进行授权。我想知道什么是存储用户名和密码以供重用的最佳方法。我是否应该使用我的自定义验证器类将它们存储在静态变量中,以便可以在任何地方访问它们? 为什么我不能使用System.Threading.Thread.CurrentPrincipal.Identity.Name,我试图获取用户名,但是它什么也没有显示,我怎么能获得密码? 谢谢 阿德南     

解决方法

仅处理和使用自定义验证程序中的凭据。如果凭据有效,则使用自定义授权策略为该用户准备具有一组角色的自定义主体,并使用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];
    }
}
    ,线程的CurrentPrincipal属性是服务在其下运行的Windows身份。您的服务正在以用户名/密码的形式接收客户端身份,并且与服务身份无关。 WCF支持模拟和委派,但不使用服务使用的自定义身份方案。 该问题的可接受答案可能是您要寻找的。如果这不起作用,则在代码中手动执行此操作会非常难看。