不将凭据传递给WCF服务,从而产生401

Jos*_*shy 7 c# impersonation wcf iis-7

我正在撕掉我的头发,我有一个WCF服务,我可以通过浏览器调用它工作正常,当我从Web应用程序使用以下方法调用它时,我得到(401)未经授权的错误.并且该服务不会被调用.更重要的是,当我从本地计算机运行我的Web应用程序(使用IIS Express的调试模式)指向我的开发服务器(IIS7)时它可以工作,但是当我将我的Web应用程序部署到开发服务器并将其指向开发服务器服务时没有401错误.我认为这与IIS7有关,但我不是百分百肯定,而且帮助会非常有用.

我已经在网上寻找答案,但到目前为止我发现的最好的是这个.

我的服务电话如下:

var request = (HttpWebRequest) WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "application/json; charset=utf-8";
request.AuthenticationLevel = AuthenticationLevel.MutualAuthRequested;
request.Credentials = CredentialCache.DefaultCredentials;

WebResponse responce = request.GetResponse();
Stream reader = responce.GetResponseStream();

var sReader = new StreamReader(reader);
string outResult = sReader.ReadToEnd();
sReader.Close();

var result = (T) JsonConvert.DeserializeObject(outResult, typeof (T));
return result;
Run Code Online (Sandbox Code Playgroud)

我对服务的配置如下所示:

  <service name="RGMPServices.Householding.Services.AccountService" behaviorConfiguration="Default">
    <endpoint address="" kind="webHttpEndpoint" endpointConfiguration="SecuredHttpEndpointBinding" contract="RGMPServices.Householding.Contracts.IAccountService" />
  </service>

  <service name="RGMPServices.Householding.Services.HouseholdService" behaviorConfiguration="Default">
    <endpoint address="" kind="webHttpEndpoint" endpointConfiguration="SecuredHttpEndpointBinding" contract="RGMPServices.Householding.Contracts.IHouseholdService" />
  </service>

  <service name="RGMPServices.Householding.Services.UserService" behaviorConfiguration="Default">
    <endpoint address="" kind="webHttpEndpoint" endpointConfiguration="SecuredHttpEndpointBinding" contract="RGMPServices.Householding.Contracts.IUserService" />
  </service>
</services>

<behaviors>
  <endpointBehaviors>
    <behavior name="webBehaviour">
      <webHttp />
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="Default">
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

<standardEndpoints>
  <webHttpEndpoint>
    <standardEndpoint name="SecuredHttpEndpointBinding" helpEnabled="true" automaticFormatSelectionEnabled="true">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" />
      </security>
    </standardEndpoint>
  </webHttpEndpoint>
</standardEndpoints>
Run Code Online (Sandbox Code Playgroud)

我在客户服务调用上记录了一些日志,就在我调用服务之前,响应是:

DEBUG 2013-10-01 13:15:13,569 452ms ServiceGetSingle - 传递登录:MYLANDOMAIN\MYLANUSERNAME

错误2013-10-01 13:15:13,631 514ms ServiceGetSingle - 错误使用用户凭据调用ServiceGetSingle登录:MYLANDOMAIN\MYLANUSERNAME System.Net.WebException:远程服务器返回错误:(401)未经授权.在Householding.Common.ServiceHelper.ServiceGetSingle [T](String url)的System.Net.HttpWebRequest.GetResponse()

代码如下:

logger.Debug("Passing Login: "
    + System.Security.Principal.WindowsIdentity.GetCurrent().Name)
Run Code Online (Sandbox Code Playgroud)

即使我将我的网站的AppPool设置为我的域帐户,它仍然没有授权我访问WCF服务,但是再次:它适用于浏览器.太奇怪了!

Kit*_*Kit 1

使用集成 Windows 身份验证(IWA) 和Kerberos时,您可能是双跳问题的受害者。第一跳是从浏览器到 Web 应用程序;第二个跃点是从您的 Web 应用程序到 WCF 服务。

以下是一些更全面地解释该问题并可能提供解决方案的资源:

您可以配置 Active Directory 以支持Kerberos 委派(通常基础架构人员不喜欢这样做),或者您可以关闭模​​拟并使用 Web 应用程序和 IIS 应用程序池的“服务”帐户,该帐户可以通过 WCF 服务进行身份验证代表最终用户。