问题描述
||
我在消息下的安全模式下使用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支持模拟和委派,但不使用服务使用的自定义身份方案。
该问题的可接受答案可能是您要寻找的。如果这不起作用,则在代码中手动执行此操作会非常难看。