gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 19:46:39 25 4
gpt4 key购买 nike

我有一个配置了 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com