我有一个带有netTcp绑定(消息-用户名)的WCF服务。
我实现了自己的UserNamePasswordValidator.Validate方法,在该方法中,我检查了凭据,然后在那里获得了一个变量,以后我在customPrincipal中需要它。
我现在的问题是,如何从UserNamePasswordValidator到customPrincipal中获取此变量?
编辑
得到它的工作,我不得不实现以下自定义的东西:
CustomServiceCredentials
ServiceCredentialsSecurityTokenManager
UserNameSecurityTokenAuthenticator
UserNamePasswordValidator
->具有返回值的自定义验证方法
授权政策
最佳答案
UserNamePasswordValidator旨在仅检查凭据。您可能需要System.IdentityModel.Policy.IAuthorizationPolicy
。请参见this question的答案。
更新:问题是OperationContext
在UserNamePasswordValidator
中尚不可用,因此您不能使用它将上下文变量传递到能够实例化自定义主体(IAuthorizationPolicy
)的位置。因此,我将创建一个可用于自定义UserNamePasswordValidator
和IAuthorizationPolicy
实现的,带有用户名(值是您的身份验证方法,如果我正确的话)的静态字典。如果您使用的是.NET 4 ConcurrentDictionary
,因为您需要处理并发性。因此,您的验证器将在字典中插入/更新用户名/身份验证方法对,您的IAuthorizationPolicy
类将通过用户名(您可以从EvaluationContext
获取它)来抓取它,然后重新实例化主体。不幸的是,我无法想象更优雅的解决方案(如果有)。
关于c# - 从UserNamePasswordValidator到Principal的变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7963742/