WPF,Active Directory和自定义角色提供程序

时间:2013-04-16 18:20:31

标签: wpf roleprovider windows-identity

我在服务器端使用WCF有一个WPF客户端/服务器应用程序。它目前是不安全的,我希望为我的Active Directory上的用户库保护它。应用程序应该托管它自己的角色/权限数据库,该数据库可以通过引用其活动目录帐户--SID,SAM等附加到用户的配置文件中。

我需要了解实现安全性的一些步骤,然后了解我的用户在我的应用程序中拥有的角色/权限:

  1. 如何让我的WPF应用程序只允许我的Active Directory授权的身份?如果有人使用某个本地用户帐户登录到他们的本地计算机,他们显然仍然可以访问运行WPF可执行文件 - 那么如何确保登录确实是Active Directory登录,而不是本地登录?这是app.config中的配置选项与asp.net web.config中的相同,我所做的只是将身份验证设置为Windows,其余的只是处理?
  2. 一旦用户被证明是有效的活动目录用户,将用户的WindowsIdentity与数据库中的表中的角色联系起来的最佳方法是什么?这是使用自定义RoleProvider最好的方法吗?
  3. 是否有任何有助于连接这些点的好文档?由于我阅读过的所有WIF文档和我观看过的所有教程,这些是对我来说没有意义的唯一内容,似乎没有在任何地方解释过。

    我知道我需要保护WCF,但我的理解是,这是相对简单的,就像在ASP.NET中一样,它只是正确配置而其余部分恰好发生。

1 个答案:

答案 0 :(得分:1)

关于问题1:

您可以在公开的WCF方法上使用PrincipalPermissionAttribute

    [PrincipalPermission(SecurityAction.Demand, Role = "ProjectManagers")]
    [PrincipalPermission(SecurityAction.Demand, Role = "Developers")]
    [PrincipalPermission(SecurityAction.Demand, Role = "Operations")]
    [PrincipalPermission(SecurityAction.Demand, Role = "Clients OU Admins")]
    public string CreateUser(string strFName, string strLName, string strPassword, string strOUName)
    {
        return CreateADAccount(strFName, strLName, strPassword, strOUName);
    }

这将仅授权作为上述四个组之一的成员的用户执行该方法。

对于问题2,我可以做下面的事情:

以下代码未经过测试且不完整。它仅用于概念化。

public class ControlAuthenticator
{
    Dictionary<string, ControlRule> ControlRules { get; set; } 
    public ControlAuthenticator()
    {
        ControlRules = new Dictionary<string, ControlRule>();
    }

    public bool UserCanRead(string controlName)
    {
        var user = MainViewModel.Current.CurrentUserPrincipal;

        return ControlRules[controlName].ReadPermission.Split(Convert.ToChar(","))
                                     .Intersect(user.GetGroups().Select(g => g.Name))
                                     .Any();
    }
}

public class ControlRule
{
    public string ControlName { get; set; }
    public string ReadPermission { get; set; }
    public string WritePermission { get; set; }
}

我们的想法是,在您的ViewModel上,您调用userCanRead(或写入我未创建的)提供控件名称的方法。你得到一个布尔值。 UserCanRead方法检查ReadPermission属性中是否有任何条目(我将其作为逗号分隔的授权组字符串)与当前用户所属的组相关联。如果存在任何关联,则返回true。

在ViewModel上,如果为true,则显示值(或允许编辑),否则显示不同的值,或禁止任何编辑。