使用Windows身份验证从ASP.NET-Webapp调用WCF-Webservice:错误401

时间:2016-03-02 12:13:21

标签: asp.net web-services wcf authentication windows-authentication

我有一个应该从ASP.NET-Web应用程序(Webform)调用的WCF-Webservice。两者都是使用Windows身份验证的IIS中的hostet。两者都部署在同一个网站上。

当我调用ASP-Webform时,浏览器要求提供凭据,在我输入正确的凭据后它返回Webform,所以我想windows验证工作正常。不幸的是,在页面中完成对WCF-Webservice的调用会导致HTTP状态401.未经授权。

以下是我如何从WebForm1.aspx调用WCF服务:

protected void Page_Load(object sender, EventArgs e)
{
  WcfService.ServiceWA client = new WcfService.ServiceWA();
  WindowsIdentity wi = (WindowsIdentity)HttpContext.Current.User.Identity;

  Response.Write(wi.Name);
  // just to check wheter I got the right credentials
  // it results in the expected DOMAIN\username output

  WindowsImpersonationContext context = wi.Impersonate();
  try
  {
    Response.Write(client.GetData(1, true));
  }
  catch (Exception ex)
  {
    Response.Write(ex.Message);
    // here I always get the 401 message
  }
  finally
  {
    context.Undo();
  }
}

WCF-Service的web.config如下所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration>

<appSettings>
  <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
  <compilation debug="true" targetFramework="4.5.1" />
  <httpRuntime targetFramework="4.5.1"/>
  <authentication mode="Windows"/>
  <identity impersonate="false"/>

    <authorization>
        <allow users="*" />
    </authorization>

    <customErrors mode="Off"/>
</system.web>
<system.serviceModel>
<behaviors>
  <serviceBehaviors>
    <behavior name="WindowsAuthentication.ServiceWABehavior">
      <!-- Legen Sie die Werte unten vor der Bereitstellung auf "false" fest, um die Veröffentlichung von Metadateninformationen zu vermeiden. -->
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
      <!-- Damit in Fehlern Ausnahmedetails zum Debuggen angezeigt werden, legen Sie den Wert unten auf "true" fest. Legen Sie ihn vor der Bereitstellung auf "false" fest, um die Veröffentlichung von Ausnahmeinformationen zu vermeiden. -->
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>


  </serviceBehaviors>
</behaviors>
<protocolMapping>
    <add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>    
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />

    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpEndpointBinding">
                <security mode="TransportCredentialOnly">
                    <transport clientCredentialType="Windows"/>
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>

    <services>
        <service behaviorConfiguration="WindowsAuthentication.ServiceWABehavior"
                                                     name="WindowsAuthentication.ServiceWA">
            <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpEndpointBinding" name="BasicHttpEndpoint" contract="WindowsAuthentication.IServiceWA">
                <identity>
                    <dns value="localhost" />
                </identity>
            </endpoint>

            <endpoint contract="IMetadataExchange"
                        binding="mexHttpBinding"
                        address="mex" />

        </service>
    </services>

</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<!--
    Um das Stammverzeichnis der Webanwendung beim Debuggen auszuwählen, legen Sie den Wert unten auf "true" fest.
    Legen Sie ihn vor der Bereitstellung auf "false" fest, um die Veröffentlichung von Informationen über den Webanwendungsordner zu vermeiden.
  -->
<directoryBrowse enabled="true"/>
</system.webServer>

</configuration>

在承载WCF和网页的IIS 7中,在“仅身份验证”下,Windows身份验证处于活动状态。激活的提供商是:NTLM,谈判

任何想法,可能是什么问题?

0 个答案:

没有答案