遇到这样的问题:当注册了
EndpointBehaviors
的
WebServiceHost
抛出异常时,我们的
CustomUserNamePasswordValidator
未运行
host.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = System.ServiceModel.Security.UserNamePasswordValidationMode.Custom;
host.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new CustomUserNamePasswordValidator();
我们以编程方式将
ServiceEndpoint
添加到主机,这会添加 Behaviors
来处理 CORS
支持和一些自定义错误处理。如果凭据失败,我们会在 UserNamePasswordValidator
中抛出异常,并且客户端会收到正确的状态代码 HttpStatusCode.Unauthorized
。
问题是,在这种情况下,我们的任何端点行为似乎都没有被调用。例如,我们有一个
IDispatchMessageInspector
,它没有被称为 AfterReceiveRequest
或 BeforeSendReply
。
我们还有一个添加
ErrorHandler
的行为,通过:
endpointDispatcher.ChannelDispatcher.ErrorHandlers.Add(new HTTPBindingErrorHandler());
当我们的自定义用户名密码验证器抛出异常时,
HTTPBindingErrorHandler
没有调用它的IErrorHandler
方法。
有谁明白为什么会发生这种情况?是否有其他方法可以在
WebServiceHost
中处理基本身份验证,从而与端点行为很好地配合?
我有一个建议你可以参考:
我的方法是创建一个 CustomUserNamePasswordValidator (需要证书)。
如:
public class CustomUserNameValidator : UserNamePasswordValidator
{
public override void Validate(string userName, string password)
{
if (null == userName || null == password)
{
//your behavior
throw new ArgumentNullException();
}
if (userName != "admin" && password != "wcf.admin")
{
//your behavior
throw new System.IdentityModel.Tokens.SecurityTokenException("Unknown Username or Password");
}
}
}
这样在抛出异常值之前就会进行清除判断。然而,这些操作不能在抛出异常之后进行。