编辑:我认为该问题可能与以下问题有关,因为一旦 WCF 服务移至 SSL ,我也在使用 SSL PrincipalPermission.Demand() 失败
我正在开发一组安全的 Web 服务,我已经实现了 CustomRoleProvider 和 CustomMembershipProvider 以对用户进行身份验证。
这很好用,但是如果用户未通过身份验证,我想限制对大多数服务调用的访问。
我计划使用以下内容来完成此任务
[PrincipalPermission(SecurityAction.Demand, Authenticated=true)]
但是,这似乎没有检测到用户何时通过身份验证并且总是引发安全异常。我不确定我做错了什么。
public class CustomMembershipProvider : MembershipProvider
{
public string UserType;
public override bool ValidateUser(string username, string password)
{
//Custom logic to work out if user exists and password is correct
//If the user exists and password matches we will get a populated user
//object containing their username and usertype
if (user == null)
{
return false;
}
else
{
return true;
}
}
}
在我的身份验证服务调用中,我检查成员资格提供程序是否返回 true 并设置表单身份验证 cookie。
if (Membership.ValidateUser(username, password))
{
FormsAuthentication.SetAuthCookie(username, false);
}
我在我的网络配置中设置了服务授权,如下所示:
<behavior name="SecureAuthServiceBehavior">
<serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="CustomRoleProvider"/>
....
</behaviour>
任何帮助将不胜感激,谢谢
编辑:
我对该问题进行了进一步调查,发现 Principal 设置正确。我有以下服务方法,在其中我得到了委托人并检查用户是否处于正确的角色,有效地执行标签在开始时所做的事情。
[PrincipalPermission(SecurityAction.Demand,Role="A" )]
public bool DoWork()
{
IPrincipal p = HttpContext.Current.User;
if (p.IsInRole("A"))
{
return true;
}
else
{
return false;
}
}
此方法当前每次都会引发 SecurityException,但是如果我在开始时注释掉主体权限,则该方法将起作用并返回 true。