CustomUserNamePasswordValidator 抛出异常后未调用 WCF 端点行为

问题描述 投票:0回答:1

遇到这样的问题:当注册了

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
中处理基本身份验证,从而与端点行为很好地配合?

.net wcf
1个回答
0
投票

我有一个建议你可以参考:

我的方法是创建一个 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");
       

    }

}

}

这样在抛出异常值之前就会进行清除判断。然而,这些操作不能在抛出异常之后进行。

© www.soinside.com 2019 - 2024. All rights reserved.