我有一个带有我自己的 UserNamePasswordValidator 的 WCF 服务设置。当验证(字符串用户名,字符串密码)方法中的身份验证失败时,我想将详细信息写入日志并抛出FaultException。
我想存储正在调用的特定服务方法的详细信息以及传入的参数以及用户名。
如何从 Validate 方法内部访问这些详细信息?
示例代码如下:
public class ColesUserNameValidator : UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
if (CheckCredentials(userName, password))
{
return;
}
else
{
// do something here to get details of the call to the service and send them to a log file
throw new FaultException("Unknown Username or Incorrect Password");
}
}
Run Code Online (Sandbox Code Playgroud)
这不可能。验证在不同的线程中运行,并且无法访问 WCF 上下文。此外,没有 WCF 上下文包含有关被调用的服务方法的信息。传入消息仅包含有关所请求的 SOAP 操作的信息。
如果你想进行一些日志记录,请实现 IErrorHandler。从自定义验证器抛出 SecurityTokenException 并在 IErrorHandler 的 ProvideFault 中处理此期望 - 创建FaultException。在 IErrorHandler 的 HandleFault 中,您可以实现日志记录。对于日志记录,您可以检查 OperationContext.Current 是否不为空(是的,如果在消息处理之前引发异常则可能为空)并访问有关当前操作调用的信息。