我需要扩展内置的WCF身份验证,因此我的新身份验证应该与内置的WCF身份验证并行工作。
例如,我想允许从注册的IP(自定义身份验证)或用户名+密码(内置身份验证)进行访问。
我已成功实施ServiceAuthenticationManager
和ServiceAuthorizationManager
。
ServiceAuthenticationManager.Authenticate
只是将IPrincipal
实施添加到邮件属性,ServiceAuthorizationManager.CheckAccessCore
将IPrincipal
从传入邮件属性复制到AuthorizationContext
属性。
但是,即使我返回ServiceAuthenticationManager.Authenticate
或authPolicy
调用的结果,base.Authenticate
也会因标准机制而完全中断。
也许我走错了方向?添加自定义WCF身份验证的正确方法是什么,而不影响现有身份验证?如果自定义失败,如何回退到内置身份验证?
答案 0 :(得分:0)
正确方法:
在OnOpening覆盖中设置ServiceHost
Authorization.PrincipalPermissionMode = PrincipalPermissionMode.Custom;
Authorization.ExternalAuthorizationPolicies = new ReadOnlyCollection<IAuthorizationPolicy>(new[] { new MyCustomAuthorizationPolicy() });
在自定义策略的Evaluate方法中,分配评估上下文的三个属性&#34; PrimaryIdentity&#34;到IIdentity,&#34;身份&#34;收集身份和&#34;校长&#34;到IPrincipal
evaluationContext.Properties["PrimaryIdentity"] = identity;
evaluationContext.Properties["Identities"] = new List<IIdentity>(new[] { identity });
evaluationContext.Properties["Principal"] = principal;