我有一个配置了 TransportWithMessageCredential
的 WCF 服务安全。 IAuthorizationPolicy
的所有三个实现, ServiceAuthenticationManager
和 ServiceAuthorizationManager
到位且有效。
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
运行,但问题依旧。
我只能看到诊断工具中的两个错误事件。
我的实现中缺少什么来让服务在访问被拒绝错误时通知用户?
更新
值得注意的是,我正在使用 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);
}
}
最佳答案
你不应该在这里期待一个 FaultException,而是一个通信异常,在你的例子中是一个 SecurityAccessDeniedException .我希望在这个阶段提出的所有异常(exception)都是沟通问题,因为它是关于沟通问题的,安全问题是其中的一部分。
关于c# - 在 CheckAccessCore 之后,WCF Access Denied 异常永远不会返回到客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37583822/