如何在WCF中获取自定义用户名/密码
我正在消息下的安全模式下使用clientCredentailType作为用户名。我创建了一个自定义用户名和密码验证程序类来验证用户名和密码 我想使用这些凭据(用户名、密码)对服务中的不同操作进行授权。我想知道存储用户名和密码以便重用的最佳方法是什么。我是否应该使用我的自定义验证器类将它们存储在静态变量中,以便在任何地方都可以访问它们 为什么我不能使用System.Threading.Thread.CurrentPrincipal.Identity.Name,我试图获取用户名,但它没有显示任何内容,如何获取密码 谢谢如何在WCF中获取自定义用户名/密码,wcf,wcf-security,Wcf,Wcf Security,我正在消息下的安全模式下使用clientCredentailType作为用户名。我创建了一个自定义用户名和密码验证程序类来验证用户名和密码 我想使用这些凭据(用户名、密码)对服务中的不同操作进行授权。我想知道存储用户名和密码以便重用的最佳方法是什么。我是否应该使用我的自定义验证器类将它们存储在静态变量中,以便在任何地方都可以访问它们 为什么我不能使用System.Threading.Thread.CurrentPrincipal.Identity.Name,我试图获取用户名,但它没有显示任何内容
Adnan线程的CurrentPrincipal属性是运行服务的Windows标识。您的服务正在以用户名/密码的形式接收客户端标识,它与服务标识没有关系。WCF支持但不像您的服务使用的那样使用自定义标识方案
这个被接受的答案可能就是你想要的。如果这不起作用,那么在代码中手动执行这项操作会很快变得非常糟糕。线程的CurrentPrincipal属性是运行服务的Windows标识。您的服务正在以用户名/密码的形式接收客户端标识,它与服务标识没有关系。WCF支持但不像您的服务使用的那样使用自定义标识方案
这个被接受的答案可能就是你想要的。如果这不起作用,那么在代码中手动执行这项操作会很快变得非常糟糕。仅处理并使用自定义验证器中的凭据。如果凭据有效,请使用自定义授权策略为该用户准备具有一组角色的自定义主体,并使用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];
}
}
[PrincipalPermission(SecurityAction.Demand,Authenticated=true,Role=“ClearedForUsingFoo”)]
公共void Foo(字符串栏)
{
...
类授权策略:IAuthorizationPolicy
{
public bool Evaluate(EvaluationContext EvaluationContext,ref对象状态)
{
//获取经过身份验证的客户端标识
IIIdentity identity=GetClientity(evaluationContext);
//设置自定义主体
evaluationContext.Properties[“主体”]=新的CustomPrincipal(标识);
返回true;
}
公共索赔集发行人
{
获取{抛出新的NotImplementedException();}
}
公共字符串Id
{
获取{return“FooBarApp.AuthorizationPolicy”;}
}
私有静态IIdentity GetClientIdentity(EvaluationContext EvaluationContext)
{
对象对象对象;
if(!evaluationContext.Properties.TryGetValue(“标识”,out obj))
抛出新异常(“未找到标识”);
IList标识=对象作为IList;
if(identifications==null | | identifications.Count仅处理和使用自定义验证器中的凭据。如果凭据有效,请使用自定义授权策略为该用户准备一组角色的自定义主体,并使用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];
}
}
[PrincipalPermission(SecurityAction.Demand,Authenticated=true,Role=“ClearedForUsingFoo”)]
公共void Foo(字符串栏)
{
...
类授权策略:IAuthorizationPolicy
{
public bool Evaluate(EvaluationContext EvaluationContext,ref对象状态)
{
//获取经过身份验证的客户端标识
IIIdentity identity=GetClientity(evaluationContext);
//设置自定义主体
evaluationContext.Properties[“主体”]=新的CustomPrincipal(标识);
返回true;
}
公共索赔集发行人
{
获取{抛出新的NotImplementedException();}
}
公共字符串Id
{
获取{return“FooBarApp.AuthorizationPolicy”;}
}
私有静态IIdentity GetClientIdentity(EvaluationContext EvaluationContext)
{
对象对象对象;
if(!evaluationContext.Properties.TryGetValue(“标识”,out obj))
抛出新异常(“未找到标识”);
IList标识=对象作为IList;
如果(Identifications==null | | Identifications.Count谢谢Oliver。我是identity framework的新手,刚刚浏览了它的一些文档。我有点困惑,如果我有自己的用户和角色自定义数据库,identity framework如何帮助我。我如何用WIF映射自定义用户/角色,以便我可以将它们用作任何其他内置角色功能性,即(Windows帐户、ASPNET角色等)。如果您有或知道关于此的任何文章,请务必让我知道。谢谢Oliver。我是identity framework的新手,我刚刚浏览了它的一些文档。我有点困惑,如果我有自己的自定义用户和角色数据库,identity framework如何帮助我。我如何使用WIF映射自定义用户/角色,以便我可以将它们用作其他内置角色功能,即(Windows帐户、ASPNET角色等)。如果您有或知道关于此的任何文章,请务必让我知道。OperationContext oc=OperationContext.Current;ServiceSecurityContext ssc=oc.ServiceSecurityContext;string client=ssc.PrimaryIdentity.Name;是否有任何方法获取密码?简短回答是否。安全上下文将提供密码d用户“身份”它通常由用户/帐户名以及用户可能是其成员的角色/组组成。由于密码仅用于身份验证,因此不会对已通过身份验证的用户公开密码。基本上,密码唯一可用的时间是在身份验证过程中。允许任何进程使用密码都是极不安全的在身份验证过程之外访问密码。OperationContext oc=OperationContext.Current;