WCF UserName身份validation:我可以在自定义ServiceAuthorizationManager中获取用户名吗?
我有一个使用自定义ServiceAuthorizationManager
的WCF服务。 自定义身份validation管理器已设置为处理Windows和Forms身份validation。
但是,如果我连接到设置为UserName
auth的客户端,我似乎无法在任何地方找到用户名。
客户端代码如下所示:
this.ClientCredentials.UserName.UserName = "user"; this.ClientCredentials.UserName.Password = "pass"; this.Open(); this.MyMethod(); // my actual contract method this.Close();
然后在服务器上,我有我的自定义身份validation管理器:
public sealed class AppAuthorizationManager : ServiceAuthorizationManager { public override bool CheckAccess(OperationContext operationContext, ref Message message) { // would like to check user/pwd here... } }
这可能吗?
-
Thread.CurrentPrincipal
未设置, - 未设置
operationContext.ServiceSecurityContext.PrimaryIdentity
。 -
operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets
为空。
用户/密码应该在任何地方可用吗? 或者我是否还要添加自定义UsernamePasswordValidator
?
更新:所以我添加了一个自定义UserNamePasswordValidator
和一个IAuthorizationPolicy
。 我更新的WCF配置如下所示:
如果我在所有3个类中设置断点,WCF会抛出exception:
LogonUser failed for the 'username' user. Ensure that the user has a valid Windows account. at System.IdentityModel.Selectors.WindowsUserNameSecurityTokenAuthenticator.ValidateUserNamePasswordCore(String userName, String password)
在任何一个运行之前。 嗯…
这通常在UsernamePasswordValidator中处理 – 这是您唯一可以访问密码的地方。 但是,这不是您设置主体的位置 – 这将在IAuthorizationPolicy
的Evaluate
方法中,它可能看起来像:
bool IAuthorizationPolicy.Evaluate( EvaluationContext evaluationContext, ref object state) { IList idents; object identsObject; if (evaluationContext.Properties.TryGetValue( "Identities", out identsObject) && (idents = identsObject as IList ) != null) { foreach (IIdentity ident in idents) { if (ident.IsAuthenticated && ident.AuthenticationType == TrustedAuthType) { evaluationContext.Properties["Principal"] = //TODO our principal return true; } } } if (!evaluationContext.Properties.ContainsKey("Principal")) { evaluationContext.Properties["Principal"] = //TODO anon } return false; }
(其中TrustedAuthType
是我们的密码validation器的名称)
有了这个,线程的主体将被设置,我们可以识别自己(并使用基于角色的安全性等)
- 适合C#的良好线性编程库?
- 如何显示(或写入文件)希腊字符?
- System.NotSupportedException – 无法比较’System.Linq.IQueryable类型的元素
- 程序自动化表单字段输入和网页结果检查
- .Net MVC 4项目因事件日志错误而失败“模块DLL C:\ WINDOWS \ system32 \ inetsrv \ aspnetcore.dll无法加载。 数据是错误的。”
- OpenID领域是否必须是网站的基本URL?
- FTP,GetResponse(),错误550文件不可用
- 在.Net 3.0中以创建日期顺序获取目录列表
- 抛出了类型’System.Windows.Forms.AxHost + InvalidActiveXStateException’的exception