从Windows Identity和thread.currentprincipal中检索WindowsPrincipal有什么区别?
-
14-10-2019 - |
题
我正在尝试解决为什么基于属性的安全性无法正常工作的原因,我怀疑这可能与以下内容有关:
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")]
帮助赞赏。
解决方案
也许是因为这不是同一类。
看看MSDN:
因此,如果有不同的类别,则可能存在不同的实现。
编辑 :
我尝试了此代码:
public class InGroup
{
public string Name { get; set; }
public bool Current { get; set; }
public bool Fixe { get; set; }
public bool Thread { get; set; }
}
WindowsIdentity current = System.Security.Principal.WindowsIdentity.GetCurrent();
WindowsPrincipal principalcurrent = new WindowsPrincipal(current);
WindowsIdentity fixe = new WindowsIdentity("JW2031");
WindowsPrincipal principalFixe = new WindowsPrincipal(fixe);
IPrincipal principalThread = System.Threading.Thread.CurrentPrincipal;
List<InGroup> ingroups = new List<InGroup>();
foreach (IdentityReference item in current.Groups)
{
IdentityReference reference = item.Translate(typeof(NTAccount));
Console.WriteLine("{0}\t{1}\t{2}\t{3}",
reference.Value,
principalcurrent.IsInRole(reference.Value),
principalFixe.IsInRole(reference.Value),
principalThread.IsInRole(reference.Value));
ingroups.Add(new InGroup()
{
Name = reference.Value,
Current = principalcurrent.IsInRole(reference.Value),
Fixe = principalFixe.IsInRole(reference.Value),
Thread = principalThread.IsInRole(reference.Value)
});
}
foreach (IdentityReference item in fixe.Groups)
{
IdentityReference reference = item.Translate(typeof(NTAccount));
if (ingroups.FindIndex(g => g.Name == reference.Value) == -1)
{
ingroups.Add(new InGroup()
{
Name = reference.Value,
Current = principalcurrent.IsInRole(reference.Value),
Fixe = principalFixe.IsInRole(reference.Value),
Thread = principalThread.IsInRole(reference.Value)
});
Console.WriteLine("{0}\t{1}\t{2}\t{3}",
reference.Value,
principalcurrent.IsInRole(reference.Value),
principalFixe.IsInRole(reference.Value),
principalThread.IsInRole(reference.Value));
}
}
这是 结果
如您所见,我没有以不同方式的相同组。因此(因为我是本地计算机的管理员),所以我认为WindowsIdentity.getCurrent将从AD和WindowsPrincipal(WindowsIdentity(“”)中获得用户,将从本地计算机获得用户。
在我的WebApp中,我获得了最低的授权(我认为)。但是,我没有关于consoleapp的解释...
这只是假设,但这是连贯的。
其他提示
我相信区别在于登录的用户和运行应用程序的帐户(线程)。这些并不总是一样。
我承认这是一个相当丑陋的解决方法,但是如果其他所有失败,您都可以替代:
principal = (WindowsPrincipal)Thread.CurrentPrincipal;
有类似的东西
principal = new WindowsPrincipal(new WindowsIdentity(Thread.CurrentPrincipal.Identity.Name));
如果那不起作用,它至少可能会具有启发性地显示出什么问题的位置。
但是我无法想象它失败了,因为它与有效的行完全相同(相关的地方)完全相同:我假设 Thread.CurrentPrincipal.Identity.Name
是 "ksarfo"
.
不隶属于 StackOverflow