Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WCF Web服务需要访问用户名和密码信息_Wcf_Service_Passwords_Web - Fatal编程技术网

WCF Web服务需要访问用户名和密码信息

WCF Web服务需要访问用户名和密码信息,wcf,service,passwords,web,Wcf,Service,Passwords,Web,我构建了一个wcf web服务,它只向CRM托管的Silverlight应用程序提供MS Dynamics SQL数据。目前,web服务托管在IIS中,并且仅通过HTTPS可用,因此消息的内容是安全的。现在,我已经准备好实现与登录Silverlight客户端应用程序的用户相关的下一个安全级别。我希望将该信息传递给web服务,然后在创建SQL Server连接对象时使用它。结果是,MS Dynamics数据库将只返回连接用户有权查看的数据 此模型不同于标准模型,标准模型包括验证给定用户访问web服

我构建了一个wcf web服务,它只向CRM托管的Silverlight应用程序提供MS Dynamics SQL数据。目前,web服务托管在IIS中,并且仅通过HTTPS可用,因此消息的内容是安全的。现在,我已经准备好实现与登录Silverlight客户端应用程序的用户相关的下一个安全级别。我希望将该信息传递给web服务,然后在创建SQL Server连接对象时使用它。结果是,MS Dynamics数据库将只返回连接用户有权查看的数据

此模型不同于标准模型,标准模型包括验证给定用户访问web服务的权限。相反,在我的模型中,每个人都被授予访问web服务的权限,SQL查询的结果基于给定用户的用户名和密码

澄清一下:Silverlight应用程序在用户登录到应用程序时收集用户名和密码。这是当web服务连接到SQL Server数据库时,web服务最终需要使用的信息。因此,我的目标是让Silverlight应用程序将用户名和密码传递给web服务,使web服务能够检索并在创建连接对象时使用它

我正在考虑一些简单的事情,比如在每个web服务请求中添加用户名和密码。不过,我更希望能够使用标准方法传递用户凭据,但我似乎找不到任何方法来获取密码。可通过OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.name访问用户名

有什么想法吗?

您可以使用向您的服务传递凭据,但这至少需要您发送具有消息安全性的凭据。您可以将其与IIS中的匿名身份验证相结合。这样,每个人都可以在传输级别上访问服务,但您可以自己处理凭据

为了扩展,我在IIS中使用HTTPS和匿名身份验证运行了一个WCF服务。在我的web.config中,我设置了一个wsHttpBinding,如下所示:

<bindings>
<wsHttpBinding>
    <binding name="CredentialsBinding" />
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>
namespace MyNamespace.CredentialValidator
{
    public class CredentialValidator:  UserNamePasswordValidator 
    {
        public override void Validate(string userName, string password)
        {
            // you can now handle the username and password passed to your service
            // with a wsHttpBinding through HTTPS
        }
    }
}
-编辑


Rory Primrose在他的文章中描述了您可能正在寻找的内容,他使用CustomUserNameSecurityTokenAuthenticator获取密码以供进一步使用。

您应该澄清要传递的用户名和密码。是否仅限Windows帐户访问CRM?域用户是否在intranet内访问Silverlight应用程序?用户是否通过其在您服务中的域帐户进行身份验证?澄清一下-Bob Jones已登录CRM。我需要在Web服务中输入Bob Jones的用户名和密码。Web服务托管在云中,然后使用用户名和密码创建到托管在另一台服务器上的数据库的连接。目前,web服务使用默认用户名和密码连接到数据库,我想改用Bob Jones。Bob Jones是Windows帐户吗?顺便说一句,在操作处理过程中,没有内置的安全机制将为您获取密码。您需要使用SQL凭据或windows凭据创建连接吗?Bob Jones不是windows帐户。需要使用SQL凭据建立连接。正如我建议的那样,我正在考虑每个web服务方法的用户名和密码参数,但我不想知道是否有更好的方法。感谢指导-你有一个例子吗?我迄今为止所做的研究表明用户名是可用的,但密码是一个隐藏的秘密。我知道这一点,但这不是我的解决方案在调用web服务方法之前发生。我需要在我的web服务方法中包含相同的信息。我不确定我是否完全理解。为什么在进行身份验证后需要密码?您可以预先使用数据库凭据进行身份验证。如果失败,抛出异常,否则继续。在您的实际方法中,您现在已经通过了身份验证,并且可以确定您希望使用用户名进行的任何授权?您阅读了我的原始帖子的第二段吗?我完全知道我可以用预先身份验证做什么。然而,这不是我的要求。silverlight应用程序向世界开放。用户提供用户名和密码,这是SQL server访问所需的凭据。Silverlight应用程序从web服务发出请求,并需要将用户提供的凭据传递给web服务。然后,web服务需要在创建SQL server连接对象以访问SQL server数据库时使用用户名和密码。
namespace MyNamespace.CredentialValidator
{
    public class CredentialValidator:  UserNamePasswordValidator 
    {
        public override void Validate(string userName, string password)
        {
            // you can now handle the username and password passed to your service
            // with a wsHttpBinding through HTTPS
        }
    }
}