c# - 在 CheckAccessCore 之后,WCF Access Denied 异常永远不会返回到客户端

标签 c# wcf security wcf-security access-denied

我有一个配置了 TransportWithMessageCredential 的 WCF 服务安全。 IAuthorizationPolicy 的所有三个实现, ServiceAuthenticationManagerServiceAuthorizationManager到位且有效。

serviceHost.Credentials.ServiceCertificate.SetCertificate("CN=localhost");
serviceHost.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new CustomValidator();
serviceHost.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = System.ServiceModel.Security.UserNamePasswordValidationMode.Custom;

serviceHost.Authorization.PrincipalPermissionMode = PrincipalPermissionMode.Custom;
serviceHost.Authorization.ServiceAuthorizationManager = new MyServiceAuthorizationManager();
serviceHost.Authentication.ServiceAuthenticationManager = new MyServiceAuthenticationManager();
serviceHost.Authorization.ExternalAuthorizationPolicies = 
    new System.Collections.ObjectModel.ReadOnlyCollection<System.IdentityModel.Policy.IAuthorizationPolicy>(
        new MyAuthorizationPolicy[] { new MyAuthorizationPolicy() });

据我所知,在 ServiceAuthorizationManager继承类,在CheckAccessCore方法,一个return false语句表示拒绝访问。这一切都很好,直到我想让客户端知道他收到拒绝访问异常,服务停止向客户端返回任何内容,并且服务线程似乎挂起。

我尝试了各种try catch在客户端甚至添加了一个 FaultContract运行,但问题依旧。

我只能看到诊断工具中的两个错误事件。

enter image description here

我的实现中缺少什么来让服务在访问被拒绝错误时通知用户?

更新

值得注意的是,我正在使用 RoutingService现在我想真正的原因是 RoutingService不知何故正在吃异常(exception),但我不知道到底发生在哪里。尽管我尝试了所有可能的方法,但我没有找到它。

更新 2

我有IErrorHandler到位:

   public class ServiceErrorHandler : IErrorHandler
    {
        public bool HandleError(Exception error)
        {
            //You can log th message if you want.            
            return true;
        }

        public void ProvideFault(Exception error, MessageVersion version, ref Message msg)
        {
            if (error is FaultException)
                return;

            FaultException faultException = new FaultException(error.Message);
            MessageFault messageFault = faultException.CreateMessageFault();
            msg = Message.CreateMessage(version, messageFault, faultException.Action);
        }
    }

但是调用客户端不会得到异常,调试事件中将出现相同的“未处理异常”。

使调用客户端失败的唯一方法是在 BeforeSendReply 中抛出异常IDispatchMessageInspector的方法|我认为这不是我得到 CommunicationException 的方法在客户端而不是 FaultException :

  public void BeforeSendReply(ref Message reply, object correlationState)
    {                        
        if (reply != null && reply.IsFault)
        {
            var messageFault = MessageFault.CreateFault(reply, Int32.MaxValue);
            throw new FaultException("Access was denied", messageFault.Code);
        }
    }

WCF 跟踪: enter image description here

最佳答案

你不应该在这里期待一个 FaultException,而是一个通信异常,在你的例子中是一个 SecurityAccessDeniedException .我希望在这个阶段提出的所有异常(exception)都是沟通问题,因为它是关于沟通问题的,安全问题是其中的一部分。

关于c# - 在 CheckAccessCore 之后,WCF Access Denied 异常永远不会返回到客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37583822/

相关文章:

java - ScintillaNET 控件不显示语法着色?

c# - 在 Exchange Web 服务 (EWS) 中处理事件时识别项目类型

ajax - 在 WCF Web Api 中设置默认响应类型

security - 在另一个协议(protocol)中建立 TLS 隧道

security - 如何在 Zend Framework 2 View 中自动转义变量

java - 我怎样才能让一个java程序分段下载自己然后运行?

C# string.format 添加一个 "-"值?

c# - Microsoft Graph SDK 和 SharePoint 列表项

WCF 构建基于 SOAP 的服务

wcf - WCF 服务与 Web 服务和 REST 服务的区别