如何将登录的用户详细信息从ASP.Net web app传递到WCF服务?

如何将登录的用户详细信息从ASP.Net web app传递到WCF服务?,asp.net,wcf,forms-authentication,impersonation,Asp.net,Wcf,Forms Authentication,Impersonation,我有两个web应用程序:一个是ASP.Net web应用程序,另一个是ASP.Net WCF web服务应用程序。我想将web应用程序添加到WFC web应用程序的消费服务。最终,这两个应用程序将通过防火墙进行通信 我希望用户使用表单身份验证登录到客户端web应用程序,并通过wcf服务进行身份验证,然后能够基于他的角色访问服务资源 到目前为止,我已经设法使用System.Web.ApplicationServices.AuthenticationService登录,尽管我还无法让IsLogged

我有两个web应用程序:一个是ASP.Net web应用程序,另一个是ASP.Net WCF web服务应用程序。我想将web应用程序添加到WFC web应用程序的消费服务。最终,这两个应用程序将通过防火墙进行通信

我希望用户使用表单身份验证登录到客户端web应用程序,并通过wcf服务进行身份验证,然后能够基于他的角色访问服务资源

到目前为止,我已经设法使用System.Web.ApplicationServices.AuthenticationService登录,尽管我还无法让IsLoggedIn服务方法返回true。但是,客户端web应用程序确实识别用户已登录

此外,我还能够创建一个虚拟服务来识别OperationContext.Current.ServiceSecurityContext.PrimaryIdentity中的用户,我认为它识别的是登录用户,但事实证明它识别的实际上是ServiceClient.ClientCredentials.UserName。如何将登录用户的详细信息传递到WCF服务

我可以将ClientCredentials.UserName设置为登录用户,但我想不出获取密码的方法

我是在使用完全错误的方法,还是我遗漏了什么?如有任何建议,将不胜感激

这是我的绑定配置:

  <wsHttpBinding>
    <binding name="wsHttp">  
      <security mode="Message">  
        <message clientCredentialType="UserName"  
          negotiateServiceCredential="false"  
          establishSecurityContext="false"/>  
      </security> 
    </binding> 
  </wsHttpBinding>  

谢谢,
如果我理解正确,您需要将ASP.NET登录用户凭据传递给WCF服务,对吗?尝试以下方法:


using (YourServiceClient client = new YourServiceClient())
{
     client.ClientCredentials.Windows.AllowedImpersonationLevel = 
          System.Security.Principal.TokenImpersonationLevel.Impersonation;
     client.ChannelFactory.Credentials.Windows.ClientCredential = 
          CredentialCache.DefaultNetworkCredentials;
     client.YourMethodHere();
}

您完全可以使用
HttpContext.Current.user.Identity.Name
属性在ASP.NET中检索当前登录的用户-问题是,通常您无法检索用于调用WCF服务的用户密码

这实际上取决于您如何进行表单身份验证。你有自己的商店吗?该存储是否以可使用的形式包含用户密码,例如,用户密码是以纯文本形式存储的(坏主意!)还是以可逆加密模式存储的


Marc

我一直在尝试在SharePoint中做类似的事情。我能想到的最佳解决方案是:

 using (ChannelFactory<IMyContract> requestChannelFactory = new ChannelFactory<IMyContract>(binding, new EndpointAddress(endPointURL)))
 {
     provider = requestChannelFactory.CreateChannel();
     using (HostingEnvironment.Impersonate())
     {
         remoteData = provider.GetData();
     }
 }
使用(ChannelFactory requestChannelFactory=newchannelfactory(绑定,新端点地址(endPointURL)))
{
provider=requestChannelFactory.CreateChannel();
使用(HostingEnvironment.Impersonate())
{
remoteData=provider.GetData();
}
}

这会尝试将我身份验证为DOMAIN\SERVER$,但不幸的是,我没有找到一种方法将客户端凭据从HttpContext中拉出来,并将它们硬塞进requestChannelFactory.credentials.Windows.ClientCredential。我很确定这是不可能的。替代方案似乎是硬编码用户名/密码或使用证书身份验证。或者允许匿名身份验证,这对我来说不是一个选项。

我们使用默认的sql server存储,因此密码是单向散列的,因此无法检索它们。我们可以在用户最初登录时存储密码,但这是我们绝对希望避免的。我认为最好是为所有调用对单个用户进行硬编码,并将登录的用户名作为参数传递。我担心:-)在这种情况下,不幸的是,我真的不知道如何才能做到这一点。您可以考虑在ASP.NET站点和WCF服务之间进行证书验证,并将“登录”的用户名作为消息标题发送给信息目的。如果您的用户已经通过ASP.NET网站的身份验证,那么一切都应该正常,对吗?