我正在研究自定义的WCF身份验证和授权,我找到了一些关于UserNamePasswordValidator和ServiceAuthorizationManager的文章。
我还发现了一些关于使用自定义System.ServiceModel.__ServiceAuthenticationManager (死链接)的线索,但msdn并没有提供太多关于它的信息( http://msdn.microsoft.com/en-us/library/system.servicemodel.serviceauthenticationmanager.aspx )。
所以我来了:有人知道更多关于ServiceAuthenticationManager的事情吗?
通常,您将如何设置自定义WCF身份验证?
发布于 2010-10-01 21:43:37
你说得对,关于这方面的文档一点帮助都没有。
我使用这个类的方法如下。重写Authenticate()方法以:
处理管道中使用该对象
您不能在这一点上只是设置线程主体,因为它稍后会被WCF更改。
ServiceAuthenticationManager.Authenticate()方法中的代码如下所示:
public override ReadOnlyCollection<IAuthorizationPolicy> Authenticate(ReadOnlyCollection<IAuthorizationPolicy> authPolicy, Uri listenUri, ref Message message)
{
int tokenPosition = message.Headers.FindHeader("Token", "http://customnamespace.org");
string token = message.Headers.GetHeader<string>(tokenPosition);
IPrincipal user = new CustomPrincipal(token);
message.Properties["Principal"] = user;
return authPolicy;
}
然后添加一个自定义授权策略,该策略
的EvaluationContext.Properties IPrincipal.IsInRole claims中的
IAuthorizationPolicy()方法中的代码如下所示
public bool Evaluate(EvaluationContext evaluationContext, ref object state)
{
IPrincipal user = OperationContext.Current.IncomingMessageProperties["Principal"] as IPrincipal;
evaluationContext.Properties["Principal"] = user;
evaluationContext.Properties["Identities"] = new List<IIdentity> { user.Identity };
IList<Claim> roleClaims = this.GetRoleClaims(user);
evaluationContext.AddClaimSet(this, new DefaultClaimSet(this.Issuer, roleClaims));
return true;
}
在服务行为配置中,您需要将principalPermissionMode=设置为“自定义”,以便将IPrincipal设置为实际服务操作调用的执行线程上的主体。
<serviceAuthorization principalPermissionMode="Custom"...
https://stackoverflow.com/questions/3715778
复制相似问题