WCF +用户凭据

Cha*_*les 5 passwords wcf credentials silverlight-3.0

我正在开发一个Silverlight v3 Web应用程序,我想保护访问我用来获取数据的WCF服务.我目前让WCF工作正常,但它不需要任何用户凭据.

我对WCF的这方面不太熟悉,所以我的第一个想法是为我的每个服务操作添加用户名和密码参数.我遇到的问题是,这需要大量冗余代码,并且用户名和密码将以纯文本形式通过网络传输.

我想要的是在创建服务代理后立即在客户端指定凭据的方法(我使用从"添加服务引用"自动生成的代理).

谷歌搜索解决方案,我只能找到类似于我的第一个想法(使用用户名/密码参数)的解决方案.有人可以指点我正确的方向吗?

谢谢!

blo*_*art 7

这些用户名和密码来自哪里?如果您的网站已经实现了表单身份验证,那么您可以自行绕过设置凭据并使用表单身份验证cookie.如果您的用户已登录,则cookie将随Web服务调用一起发送.为了在另一侧阅读它,您需要进行一些更改.

首先,您需要在system.ServiceModel部分中为WCF启用ASP.NET兼容模式:

<system.serviceModel>  
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> 
</system.serviceModel>
Run Code Online (Sandbox Code Playgroud)

完成后,对于要了解ASP.NET cookie的每个服务方法,将[AspNetCompatibilityRequirements]属性添加到服务类中

[ServiceContract]
[AspNetCompatibilityRequirements(
    RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class ExampleService
{
}
Run Code Online (Sandbox Code Playgroud)

现在,在每个方法中,您都可以访问HttpContext.Current.User.Identity对象以发现用户的身份.

如果您只希望经过身份验证的用户调用某些方法,那么您可以使用PrincipalPermission

[OperationContract]
[PrincipalPermission(SecurityAction.Demand, Authenticated=true)]
public string Echo()
Run Code Online (Sandbox Code Playgroud)

如果您使用的是ASP.NET的角色提供程序,那么这些也将被填充,然后您可以使用PrincipalPermission方法将它们限制为特定角色的成员:

[OperationContract]
[PrincipalPermission(SecurityAction.Demand, Role="Administators")]
public string NukeTheSiteFromOrbit()
Run Code Online (Sandbox Code Playgroud)

这显然也适用于Silverlight2.