System.Net.Http.WinHttpException:访问被拒绝?

时间:2018-02-18 11:02:42

标签: c# .net-core httpclient impersonation asp.net-core-webapi

我实现了两个aspnet核心webapi服务。第一个服务(.net核心)使用restsharp调用第二个服务(.net framework 461):

 public static RestResponse Execute(this IRestClient client, IRestRequest request)
    {
        var taskCompletion = new TaskCompletionSource();
        client.ExecuteAsync(request, r => taskCompletion.SetResult(r));
        return (RestResponse)(taskCompletion.Task.Result);
    }

请注意,该任务是故意同步调用的,因此代码中的.Result。此方法也称为使用经过身份验证的用户进行模拟!

这两项服务都托管在IIS中,并配置为使用Kerberos Windows身份验证。两种服务都以管理员身份运行。只有第一个服务使用https而另一个服务仅使用http,但两者都使用与绑定URL相同的域。现在,当我在本地开发环境中调试两个服务时,一切正常。将代码移动到IIS我得到以下异常:

enter image description here

调用上述方法Execute时发生错误。我检查了事件日志,如果Kerberos可能有问题但无法看到任何与Kerberos相关的问题。在我的日志文件中,我还可以看到第二个服务没有运行任何代码,调用没有那么远。

有人可以指出我正确的方向。我不知道可能导致这个问题的原因。

更新 我试图用服务器外部的Firefox调用这两种服务,但是在服务器重新启动后它再也没有工作了。非常奇怪的行为。

1 个答案:

答案 0 :(得分:0)

我发现我们得到的例外是由于服务主要名称错误地分配给两个服务。这两种服务都在同一台机器上运行,这引起我们对两种服务使用相同的SPN,但使用不同的端口。这是一个坏主意(不要这样做!)并导致各种奇怪的异常,例如WebException" Access被拒绝"。

使用唯一的SPN分配每个服务解决了问题,异常消失了。