ASP.NET 成员资格提供程序身份验证无法对 WCF 服务进行身份验证
我有一个启用了角色的 SqlMembershipProvider 存储。此配置已配置,用户“devtest”的角色为“xxUser”和“xxAdmin”。
我还有一个 WCF 服务,我想对其进行身份验证和授权。我的问题是:
- 没有授权 发生了,代码就执行了 尽管有策略属性,
- 我没有获得任何身份或安全性 上下文所以不知道是谁 调用我需要的服务
:
- 知道哪个用户正在调用 方法
- 某种程度拒绝的 如果权限不匹配的用户 (理想情况下应该执行 内 角色提供者/成员提供者/WCF 但如果必须的话可以自己做)
- 传输中的 SSL
我的服务合同设置如下:
[ServiceContract]
public interface ISupportService
{
[OperationContract]
[PrincipalPermission(SecurityAction.Demand, Role = "ThisRoleDoesNotExist")]
List<BaseInterestRate> GetAllBaseInterestRates();
}
代码足够简单:
public class SupportService : ISupportService
{
public List<BaseInterestRate> GetAllBaseInterestRates()
{
OperationContext operationContext = OperationContext.Current;
ServiceSecurityContext serviceSecurityContext = ServiceSecurityContext.Current; // is always null
using (xxxEntities entities = new xxxEntities())
{
return new List<BaseInterestRate>(entities.BaseInterestRates);
}
}}
我的服务配置如下:
-->
<behaviors>
<serviceBehaviors>
<behavior name="SupportServiceBehavior">
<serviceMetadata httpGetEnabled="false" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
<serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="AspNetSqlRoleProvider" />
<serviceCredentials>
<userNameAuthentication userNamePasswordValidationMode="MembershipProvider"
membershipProviderName="SqlMembershipProvider" />
</serviceCredentials>
</behavior>
<behavior>
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
已经配置了 MembershipProvider:
<membership defaultProvider="SqlMembershipProvider" >
<providers>
<clear/>
<add name="SqlMembershipProvider"
connectionStringName="SqlMembershipProvider"
applicationName="xxx"
type="System.Web.Security.SqlMembershipProvider" />
</providers>
</membership>
<roleManager enabled="true">
<providers>
<clear />
<add connectionStringName="SqlMembershipProvider" applicationName="xxx"
name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider" />
<add applicationName="xxx" name="AspNetWindowsTokenRoleProvider"
type="System.Web.Security.WindowsTokenRoleProvider" />
</providers>
</roleManager>
我已按照这些页面上的说明进行操作:
- 如何目标:在 Windows 窗体的 WCF 调用中使用 SQL Server 角色提供程序和 Windows 身份验证 (MSDN)
- 如何:开发期间在 WCF 中创建和安装临时客户端证书 (MSDN)
- 如何:在 Windows 窗体 (MSDN) 的 WCF 调用中使用 wsHttpBinding 与用户名身份验证和 TransportWithMessageCredentials
- 通过 SO 发现也非常有用: 将 Asp.Net 会员提供商与 WCF .svc 服务(Alkampfer's Place)一起使用
我至少预计会出现证书/传输/等问题。因异常而失败,但我可以直接在 WCF 调用中进行调试。我没有可用的安全上下文/用户上下文,当我使用不属于上述两个角色的用户时(我在上面的代码示例中这样做),我不会被“踢出”。
我的客户端应用程序当前是一个 Web 应用程序,但最终还将提供 Windows 窗体应用程序和测试套件。我当前正在使用 ASP.NET WebDev 服务器并运行 .NET 4.0。
我错过了什么吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我对 WCF Rest 服务有点陌生,但在我自己的测试过程中,我遇到了与此类似的问题。我看到了这个视频,它有点帮助(即使它不完全是我想要做的):
http://channel9.msdn.com/blogs/rojacobs/endpointtv-secure-restful-services-with-aspnet-membership
本质上问题是在 asp.net 配置下,我必须禁用匿名访问才能使用 MembershipProvider 身份验证:
I'm a little new to WCF Rest services, but during my own testing I ran into a similar problem to this. I came across this video, which helped a bit (even if it wasn't quite what I was trying to do):
http://channel9.msdn.com/blogs/rojacobs/endpointtv-securing-restful-services-with-aspnet-membership
Essentially the problem was that under the asp.net configuration I had to disable anonymous access in order for it to use the MembershipProvider authentication:
我认为您不能在界面上设置主体权限。
我敢打赌,如果你将它移到服务实现方法上,它会起作用
,或者至少会因为不同的原因而开始中断(我目前陷入了这一点 - 我遇到了访问被拒绝的异常 - 希望你不会!)
(我首先尝试将它们也在合约界面上)
I don't think you can set the principal permission on the interface.
I bet if you move it onto the service implementation method it will work
or at least start breaking for a different reason (I am currently stuck at that point - I get access denied exceptions - hopefully you dont!)
(I first tried to put them on the contract interface also)
这是使用 SSL 自托管的 wcf 服务的正确配置:
如果您想了解更多信息,请查看以下内容:
http://www.albertoschiassi.it/Home/tabid/55/EntryId/94/Use-ASP-NET -SqlMemberShipProvider-in-WCF-self-hosted-service.aspx
和
http://www.albertoschiassi.it/Home/tabid/55/EntryId/95/Use-ASP-NET- SqlMemberShipProvider-in-WCF-self-hosted-service-with-SSL.aspx
this is the correct configuration for wcf service self-hosted with SSL:
if you want more info take a look this:
http://www.albertoschiassi.it/Home/tabid/55/EntryId/94/Use-ASP-NET-SqlMemberShipProvider-in-WCF-self-hosted-service.aspx
and
http://www.albertoschiassi.it/Home/tabid/55/EntryId/95/Use-ASP-NET-SqlMemberShipProvider-in-WCF-self-hosted-service-with-SSL.aspx