【问题标题】:Get username in WCF service using basic auth with IIS使用带有 IIS 的基本身份验证在 WCF 服务中获取用户名
【发布时间】:2011-12-05 14:03:44
【问题描述】:

我在本地计算机上的 IIS Express 中运行了 WCF 服务。我正在使用 HTTP 基本身份验证(目前没有 SSL)。我有一个用于调用服务器的测试客户端。

我需要发起请求的用户名(基本身份验证的用户名部分)。我意识到 IIS 正在为我处理身份验证,并根据 Windows 用户帐户检查用户名/密码。这对我的目的来说很好。我的问题是,一旦调用了我的服务,我就无法在任何地方找到用户名。我以为它会在Thread.CurrentPrincipal.Identity.Name 中,但该值是一个空字符串。有没有办法访问这个值?

如果相关,这里有约束力:

<basicHttpBinding>
<binding name="basicauth" closeTimeout="00:01:00" openTimeout="00:01:00" 
receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" 
bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" 
maxBufferSize="99999999" maxBufferPoolSize="524288" maxReceivedMessageSize="99999999" 
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" 
useDefaultWebProxy="true">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" 
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
  <security mode="TransportCredentialOnly">
    <transport clientCredentialType="Basic" realm="" />
  </security>          
</binding>
</basicHttpBinding>

更新:谢谢大家。想通了我的问题。我没有正确关联我的端点和我的绑定,所以端点默认为一些动态绑定。即使我为基本身份验证配置了我的绑定,端点也没有设置为使用它。

一旦我解决了这个问题,用户名就出现在了

ServiceSecurityContext.Current.WindowsIdentity.Name

属性符合预期。

【问题讨论】:

    标签: c# .net asp.net wcf iis


    【解决方案1】:

    Thread.CurrentPrincipal.Identity.Name 通常会检索在 IIS 中执行 WCF 工作线程的标识。这不是特别有用的信息。您检查过ServiceSecurityContext.Current.PrimaryIdentity.Name 是否包含来自服务器的身份验证信息?

    【讨论】:

    • 不幸的是,ServiceSecurityContext.Current 属性为空。
    • @knms:听起来服务没有将服务器变量解释为有意义的安全上下文。我会进一步调查。出于好奇,哪个版本的 IIS?
    【解决方案2】:

    这可能有效 - 它适用于 Windows 身份验证。不记得它是否适用于基本...值得一试。

    OperationContext.Current.ServiceSecurityContext.WindowsIdentity.Name

    【讨论】:

      【解决方案3】:

      由于您正在设置clientCredentialType = "Basic",您将无法从 WCF 获得 Windows 标识。如果您使用“Windows”而不是“Basic”并将 WCF 配置为支持 impersonation as shown in this blog post,则应该能够获取身份用户名。

      【讨论】:

      • 感谢您的链接。我会尝试一下,但我的理解是使用 Windows 而不是 Basic 导致 NTLM 身份验证,而不是在 HTTP 标头中传递的简单用户名/密码。那不是我要找的。是否真的不可能在服务中获得一次在标头中传递的凭据?这似乎很奇怪。
      • 除非您实现 custom soap headercustom authentication,否则 WCF 开箱即用将不支持访问基本 HTTP 身份验证凭据。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多