【发布时间】:2011-06-01 14:19:42
【问题描述】:
我正在尝试找出为什么基于属性的安全性在 WCF 中无法正常工作,我怀疑这可能与以下原因有关:
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
var identity = new WindowsIdentity("ksarfo");
var principal = new WindowsPrincipal(identity);
Console.WriteLine("\nChecking whether current user [" + identity.Name + "] is member of [" + groupName + "]");
Console.WriteLine(principal.IsInRole(groupName)); // returns true
principal = (WindowsPrincipal)Thread.CurrentPrincipal;
identity = (WindowsIdentity) principal.Identity;
Console.WriteLine("\nChecking whether current user [" + identity.Name + "] is member of [" + groupName + "]");
Console.WriteLine(principal.IsInRole(groupName)); // returns false
我不明白为什么函数调用的结果不同:
principal.IsInRole(groupName)
为了完整起见,代码实际失败的点在这里:
PrincipalPermission(SecurityAction.Demand, Role = "PortfolioManager")]
帮助表示赞赏。
【问题讨论】:
-
我对那个类不是很熟悉,但是我想知道比较两个身份的 .Token 属性是否会显示出差异?一个是本地系统帐户,另一个是网络帐户...类似的。
-
谢谢格雷格。令牌是“与当前执行线程关联的访问令牌的句柄”——它们确实不同。不知道这意味着什么,除了他们有不同的指针。每次代码运行时,令牌都彼此不同,并且与之前的执行不同。我预料到了这一点。对于 IsSystem 属性,两者都返回 true。 Owner 属性(SID 或安全标识符)的值也相同。两个小时后,我失去了生存的意愿。
-
您是否在 Windows Vista 或更高版本上运行?我想知道这是否与 UAC 的邪恶有关;我认为 Windows 在登录期间会创建一个假用户,该用户看起来与现有用户大部分但并不完全相同。您可以通过以管理员身份运行应用程序并查看是否可以解决问题来测试这是否是问题。
-
在 MSDN 上查找客户端模拟。
标签: c# security active-directory wcf-security windows-principal