我在服务器端使用WCF有一个WPF客户端/服务器应用程序。它目前是不安全的,我希望为我的Active Directory上的用户库保护它。应用程序应该托管它自己的角色/权限数据库,该数据库可以通过引用其活动目录帐户--SID,SAM等附加到用户的配置文件中。
我需要了解实现安全性的一些步骤,然后了解我的用户在我的应用程序中拥有的角色/权限:
是否有任何有助于连接这些点的好文档?由于我阅读过的所有WIF文档和我观看过的所有教程,这些是对我来说没有意义的唯一内容,似乎没有在任何地方解释过。
我知道我需要保护WCF,但我的理解是,这是相对简单的,就像在ASP.NET中一样,它只是正确配置而其余部分恰好发生。
答案 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,则显示值(或允许编辑),否则显示不同的值,或禁止任何编辑。