WCF CustomRoleProvider and Principle Permissions



编辑:我认为这个问题可能与下面的问题有关,因为我也在使用SSLWCF服务移动到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);
        }

我在我的web配置中设置了服务授权,如下所示:

    <behavior name="SecureAuthServiceBehavior">
      <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="CustomRoleProvider"/>
      .... 
     </behaviour>

任何帮助都将不胜感激,谢谢

编辑:

我对这个问题做了进一步的调查,发现校长的设置是正确的。我有下面的Service方法,在其中我得到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。

PrincipalPermission检查Thread.CurrentPrincipal,而不是HttpContext.Current.User,这就是为什么在Principal_Permission属性被注释掉的情况下,DoWork()返回true,但在该行存在的情况下返回false(因为Thread.Current Principal没有设置为任何值)。

在服务类的构造函数中,我将Thread.CurrentPrincipal设置为HttpContext.Current.User,现在它们正确匹配。principalpermission属性会按照您的期望阻止/允许。

相关内容

  • 没有找到相关文章

最新更新