WCF 中的 ServiceSecurityContext.Current 为 null

ija*_*n03 5 silverlight wcf

我正在尝试在 WCF 服务中检索登录的 Windows 用户。我尝试过使用 ServiceSecurityContext 但 Current 始终为空。

ServiceSecurityContext.Current.WindowsIdentity.Name
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用OperationContext。在这种情况下,ServiceSecurityContext 返回 null。

OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name
Run Code Online (Sandbox Code Playgroud)

这是我的 web.config:

 <bindings>
  <basicHttpBinding>
    <binding name="HttpWindowsBinding">
      <security mode="TransportCredentialOnly">
        <transport clientCredentialType="Windows" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings> 
Run Code Online (Sandbox Code Playgroud)

<authentication mode="Windows"/> 
Run Code Online (Sandbox Code Playgroud)

谁能看到我做错了什么吗?

更新:我放弃了让 ServiceSecurityContext 工作的尝试。最后,我通过设置aspNetCompatibilityEnabled =“true”找到了解决方案。

<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />
Run Code Online (Sandbox Code Playgroud)

我还在我的服务类中添加了以下属性:

[System.ServiceModel.Activation.AspNetCompatibilityRequirements(RequirementsMode = System.ServiceModel.Activation.AspNetCompatibilityRequirementsMode.Required)]
Run Code Online (Sandbox Code Playgroud)

这允许我通过以下方式检索 Windows 用户:

HttpContext.Current.User.Identity.Name
Run Code Online (Sandbox Code Playgroud)

Gre*_*uFn 1

我遇到了同样的错误并设法解决了它,您不需要使用 basichttpBinding。下面是我的配置:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
      <bindings>
        <wsHttpBinding>
          <binding name="MSADC">
            <security mode ="Message">
              <transport clientCredentialType="Windows" />
              <message establishSecurityContext="true" />
            </security>
          </binding>
        </wsHttpBinding>
      </bindings>
        <behaviors>
            <serviceBehaviors>
                <behavior name="">
                    <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
                    <serviceDebug includeExceptionDetailInFaults="false" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
        <services>
            <service name="WCFAuthentication.WCFAuthentication">
                <endpoint bindingConfiguration="MSADC" address="" binding="wsHttpBinding" contract="WCFAuthentication.IWCFAuthentication">
                    <identity>
                        <dns value="localhost" />
                    </identity>
                </endpoint>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:8088" />
                    </baseAddresses>
                </host>
            </service>
        </services>
    </system.serviceModel>
  <appSettings>
    <add key="wcf:disableOperationContextAsyncFlow" value="false" />
  </appSettings>
</configuration>
Run Code Online (Sandbox Code Playgroud)