【问题标题】:How to get Custom UserName/Password in WCF如何在 WCF 中获取自定义用户名/密码
【发布时间】:2011-07-06 01:20:46
【问题描述】:

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

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

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

谢谢 阿德南

【问题讨论】:

    标签: wcf wcf-security


    【解决方案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];
        }
    }
    

    【讨论】:

    • 谢谢奥利弗。我是身份框架的新手,我刚刚浏览了它的一些文档。如果我有自己的包含用户和角色的自定义数据库,我有点困惑,身份框架如何帮助我。如何使用 WIF 映射我的自定义用户/角色,以便我可以将它们用作任何其他内置角色功能,即(Windows 帐户、ASPNET 角色等)。如果您有或知道任何关于此的文章,请告诉我。
    【解决方案2】:

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

    这个question 的公认答案可能是您正在寻找的。如果这不起作用,那么在代码中手动执行此操作很快就会变得非常难看。

    【讨论】:

    • OperationContext oc = OperationContext.Current; ServiceSecurityContext ssc = oc.ServiceSecurityContext;字符串客户端 = ssc.PrimaryIdentity.Name;有什么方法可以获取密码吗?
    • 简短回答是否定的。安全上下文将提供授权用户“身份”,通常由用户/帐户名称以及用户所属的角色/组组成。由于密码仅对身份验证有用,因此永远不会向已通过身份验证的用户公开。基本上,它唯一可用的时间是在身份验证过程中。允许任何进程在身份验证过程之外访问密码是非常不安全的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 1970-01-01
    • 1970-01-01
    • 2011-07-07
    • 2011-04-22
    • 2020-10-16
    • 1970-01-01
    相关资源
    最近更新 更多