【发布时间】:2011-05-01 06:31:49
【问题描述】:
我有一个启用了角色的 SqlMembershipProvider 存储。这是配置的,并且用户“devtest”在角色“xxUser”和“xxAdmin”中。
我还有一个 WCF 服务,我想对其进行身份验证和授权。我的问题是:
- 授权不 发生,代码只是执行 尽管有政策属性
- 我没有任何身份或安全性 上下文所以不知道是谁 调用服务
我需要:
- 知道哪个用户正在呼叫 方法
- 某种程度的拒绝 权限不匹配的用户 (理想情况下应该执行 内 RoleProvider/MembershipProvider/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>
我已按照这些页面上的说明进行操作:
- How to: Use the SQL Server Role Provider with Windows Authentication in WCF Calling from Windows Forms (MSDN)
- How to: Create and Install Temporary Client Certificates in WCF During Development (MSDN)
- How to: Use wsHttpBinding with Username Authentication and TransportWithMessageCredentials in WCF Calling from Windows Forms (MSDN)
- 通过 SO 发现也非常有用:Use Asp.Net Membership provider with a WCF .svc service (Alkampfer's Place)
我至少预计证书/传输/等会出现问题。因异常而失败,但我可以直接在 WCF 调用中进行调试。我没有可用的安全上下文/用户上下文,当我使用不属于上述两个角色的用户时(我在上面的代码示例中这样做),我不会被“踢出”。
我的客户端应用程序目前是一个 Web 应用程序,但最终也将提供一个 Windows 窗体应用程序和测试套件。我目前正在使用 ASP.NET WebDev 服务器并且正在运行 .NET 4.0。
我错过了什么吗?
【问题讨论】:
-
ISupportService 实现的属性是什么?
-
实现类上没有属性。我已经更新了帖子以反映。
标签: asp.net wcf asp.net-membership