将Windows凭据传递给远程WCF服务

3

我有一个远程的WCF服务,托管在IIS上。然后我有一个托管在Azure Websites上的ASP.NET MVC网站。

该网站使用Azure Active Directory对用户进行身份验证,并且它可以正常工作。然而,WCF服务需要正确的Windows(基于域)凭据才能返回结果。

当我在我的ASP.NET MVC应用程序中实例化服务时,我正在使用:

SomeService.ServiceClient client = new ServiceClient ("SOAP");
client.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Impersonation;

这是由Web.config文件支持的:
<basicHttpBinding>
  <binding name="SOAP" allowCookies="true" maxReceivedMessageSize="20000000"
           maxBufferSize="20000000"
           maxBufferPoolSize="20000000">
    <readerQuotas maxDepth="32"
           maxArrayLength="200000000"
           maxStringContentLength="200000000"/>

    <security mode="TransportCredentialOnly">
      <transport clientCredentialType="Windows" proxyCredentialType="None" realm="" />
      <message clientCredentialType="UserName" algorithmSuite="Default" />
    </security>
  </binding>
</basicHttpBinding>

当我在本地运行时,它可以正常工作——我从本地AppPool中获取凭据,这些凭据有效用于访问WCF服务。然而,一旦我将网站部署到Azure上,由于显然服务不知道我本地的凭据,上述方法就会失效。
问题:
有没有办法通过浏览器向WCF服务传递Windows凭据,而不破坏AAD auth栈,因为我只需要这些凭据来进行WCF连接,而不需要其他任何东西?我非常乐意显示一个系统提示框以输入凭据。

你最终解决了这个问题吗?我也在尝试做同样的事情,但我想从JavaScript中调用该Web服务,而不是像你所做的那样使用.NET Service Client从C#中调用。 - Azure Terraformer
1个回答

0

您应该能够像这样设置Windows凭据...

 SomeService.ServiceClient client = new ServiceClient ("SOAP");
 client.ClientCredentials.Windows.ClientCredential = new NetworkCredential("Username", "Password", "Domain");

希望这可以帮助!

这将意味着要么硬编码凭据,要么我构建一个自定义提示来传递这些凭据。在我这样做之前,我想知道是否有一种内置的方法可以在没有额外开销的情况下完成。谢谢! - Den
没问题 - 你试过传递 System.Net.CredentialCache.DefaultCredentials 吗? - heymega
DefaultCredentials 表示当前安全上下文中的系统凭据,它将获取服务器上的 AppPool 上下文而非我的本地计算机。 - Den

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接