使用 Azure 应用服务中托管的 WCF 服务时出现凭据错误

Posted

技术标签:

【中文标题】使用 Azure 应用服务中托管的 WCF 服务时出现凭据错误【英文标题】:Credential Error while consuming the WCF Service hosted in Azure App Service 【发布时间】:2019-01-31 10:11:24 【问题描述】:

我使用“云服务 >> WCF Web 角色”创建了一个 WCF 服务(如下图所示)。 (这只是我一直在进行的一个测试练习,以确保 WCF 可以托管在 Azure 应用服务中,并通过使用 C# 创建的外部应用进行连接。

[在此处输入图片描述]1

我的 WebConfig 如下:

<?xml version="1.0"?>
<configuration>
  <system.diagnostics>
    <trace>
      <listeners>
        <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=2.8.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
          name="AzureDiagnostics">
          <!--<filter type="" />-->
        </add>
      </listeners>
    </trace>
  </system.diagnostics>
  
  <system.web>
    <compilation debug="true" targetFramework="4.6.1" />
    <authentication mode="None"/>
  </system.web>
  
  <system.serviceModel>

    <!--DECLARE BINDINGS-->
    <bindings>
      <wsHttpBinding>
        <binding name="CustomBinding"
          openTimeout="00:20:00"
          receiveTimeout="00:20:00" closeTimeout="00:20:00"
          sendTimeout="00:20:00" >
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None" realm=""/>
            <message algorithmSuite="Default" clientCredentialType="None"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>

    <!--DECLARE BEHAVIOUR-->
    <behaviors>
      <serviceBehaviors>
        <behavior name="CustomBehaviour">
          <!-- To avoid disclosing metadata information, set the value below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>

    <!--CREATE SERVICE WITH ENDPOINTS-->
    <services>
      <!-- Service For Main Implementation-->
      <service name="DolphinBimUserRegistration.Service1" behaviorConfiguration="CustomBehaviour">
        <endpoint address="DBWsHttp" binding="wsHttpBinding" bindingConfiguration="CustomBinding" contract="DBIMInterface.IDBIMService"/>
      </service>
    </services>
    
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
    -->
    <directoryBrowse enabled="true"/>
  </system.webServer>

</configuration>

将 WCF 服务发布到 Azure 应用服务后,我可以创建服务引用。到这里为止一切都很完美..

在调试过程中,当我尝试调用 WCF 服务中的基本“GetData”函数时,它频繁地请求用户凭据(如下图所示)。

enter image description here

我需要找到一种无需手动输入凭据即可访问我的 azure Web 应用服务的方法。我一直试图解决这个问题很长时间。似乎没有任何效果。

我在某处读到,我们可以输入通过在 Azure 中使用“获取发布配置文件”获得的凭据来登录。但是,这似乎不是一个好方法。我们不能在客户端应用程序中输入此类机密信息。当不同的人使用客户端应用程序时,他们不应输入凭据以访问 Azure Web 应用程序。如何避免输入凭据? Visual Studio(或客户端应用程序)如何连接到 Azure Web 应用?

【问题讨论】:

【参考方案1】:

我必须问 - 为什么选择使用 WCF 而不是 ASP.NET Web API(或任何其他现代 RESTFul 框架)来提供服务? OAuth/JWT 是云中的现代服务用于安全的。 API 受可以在 Azure AD 中创建的客户端 ID 和机密保护。我认为您不会在 Azure 中找到对 WCF 的太多支持。无论哪种方式,如果您必须使用 WCF,以下是针对 WCF 使用 OAuth 的参考:OAuth and WCF SOAP service

为了回答您的其他问题,Visual Studio 使用发布配置文件将 Web 应用程序部署到 Azure。当您第一次尝试从 Visual Studio 发布时,它将允许您导入发布配置文件。您可以从 Azure 应用服务的仪表板获取此信息,也可以将 Visual Studio 指向 Azure 中的应用服务。此对话框将为您提供保留凭据的选项。

您会发现每个发布配置文件有两种类型的文件,一个 .pubxml 文件和一个 .pubxml.user 文件。对于 Web 部署和 FTP 发布,.pubxml.user 文件包含加密形式的密码。用户名可以在 .pubxml 文件中找到。

【讨论】:

感谢 Ibrahim.. 由于我很早就习惯了 WCF 和桌面应用程序开发(通过 C#/Vb.net),所以我有点犹豫要迁移到 Asp.net Web Api.. 搜索后在线获得对 WCF/Azure 的一些支持,我意识到,现在是时候迁移到 Asp.net 了。感谢您的帮助.. 如果您觉得我的回答有帮助,请点赞。这使可能处于类似情况的其他人相信上述指导。

以上是关于使用 Azure 应用服务中托管的 WCF 服务时出现凭据错误的主要内容,如果未能解决你的问题,请参考以下文章

将 WCF SOAP 和 WCF REST 服务托管为 Azure 应用服务

Azure 功能无法访问托管在内部 windows 服务器中的 WCF 服务

如何从 Azure Web 应用程序与 IIS 中本地托管的 WCF 服务进行通信?

如何结合调试 Azure 应用服务和 IIS 托管的 WCF?

有时调用 Microsoft Azure 托管的 WCF 服务会导致“SSL/TLS 的信任关系”问题

在 Azure 中托管 WCF 和可扩展性怎么样?