我在Message下的安全模式下使用clientCredentailType作为用户名。我创建了一个自定义用户名和密码验证程序类来验证用户名和密码。
我想使用这些凭据(用户名,密码)来授权服务中的不同操作。我想知道最新的存储用户名和密码以便重用的方法。我应该使用自定义验证器类将它们存储在静态变量中,以便它们可以在任何地方访问吗?
为什么我不能使用System.Threading.Thread.CurrentPrincipal.Identity.Name,我试图获取用户名,但它没有显示任何内容,我怎样才能获得密码?
由于 阿德南
答案 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的接受答案可能就是您要找的内容。如果这不起作用,那么在代码中手动执行此操作会非常难看。