我构建了一个wcf Web服务,它只是向CRM托管的Silverlight应用程序提供MS Dynamics SQL数据。目前,Web服务托管在IIS中,并且只能通过HTTPS使用,因此消息的内容是安全的。我现在准备实现与谁登录Silverlight客户端应用程序有关的下一级安全性。我想将该信息传递给Web服务,然后在创建SQL Server Connection对象时使用它。结果将是MS Dynamics数据库将仅返回已连接用户有权查看的数据。
此模型与标准模型不同,后者包括对给定用户进行身份验证以访问Web服务。相反,在我的模型中,每个人都被授予访问Web服务的权限,SQL查询的结果基于给定用户的用户名和密码。
澄清: Silverlight应用程序在用户登录应用程序时会收集用户名和密码。当Web服务连接到SQL Server数据库时,这是Web服务最终需要使用的信息。因此,我的目标是让Silverlight应用程序将用户名和密码传递给Web服务,以便Web服务可以检索它并在创建Connection对象时使用它。
我正在考虑像为每个Web服务请求添加用户名和密码一样简单的事情。但是,我宁愿能够使用标准方法传递用户凭据,但我似乎找不到任何方法来获取密码。用户名可通过OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name访问。
有什么想法吗?
答案 0 :(得分:0)
您可以使用wsHttpBinding将凭据传递到您的服务,但这至少要求您发送带有邮件安全性的凭据。您可以将其与IIS中的匿名身份验证结合使用。这样,每个人都可以在传输级别访问该服务,但您将能够自己处理凭据。
要扩展,我在IIS中使用HTTPS和匿名身份验证运行WCF服务。在我的web.config中,我设置了一个wsHttpBinding,如下所示:
<bindings>
<wsHttpBinding>
<binding name="CredentialsBinding" />
<security mode="TransportWithMessageCredential">
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</wsHttpBinding>
</bindings>
在我的行为中,我为自定义用户名/密码验证器设置了servicebehavior,如下所示:
<behaviors>
<serviceBehaviors>
<behavior name="DefaultBehavior">
<serviceCredentials>
<userNameAuthentication
userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="MyNamespace.CredentialValidator, MyNamespace"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
验证器如下所示:
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在他的文章WCF Security: Getting the password of the user中描述了您可能正在寻找的内容,使用CustomUserNameSecurityTokenAuthenticator获取密码以供进一步使用。