我正在尝试允许管理员组中的所有用户通过WCF进行访问。
internal sealed class AuthorizationManager : ServiceAuthorizationManager
{
public override bool CheckAccess(OperationContext operationContext)
{
base.CheckAccess(operationContext);
ReadOnlyCollection<ClaimSet> claimSets = operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets;
ClaimSet claimSet = claimSets[0];
foreach (var claim in claimSet.FindClaims(ClaimTypes.Sid, Rights.Identity))
{
SecurityIdentifier sid = (SecurityIdentifier)claim.Resource;
NTAccount ntAccount = (NTAccount)sid.Translate(typeof(NTAccount));
//This line throws an error. How can i convert a SecurityIdentifier to a WindowsIdentity?
WindowsIdentity user = new WindowsIdentity(ntAccount.Value);
WindowsPrincipal principal = new WindowsPrincipal(user);
return principal.IsInRole(WindowsBuiltInRole.Administrator);
}
}
}
答案 0 :(得分:3)
您必须进行身份验证。您有一个标识帐户的标识符,它与帐户名称同构,即SID:S-1-5-domain-500&lt; =&gt; DOMAIN \管理员。 WindowsIdentity是经过身份验证的用户。
也就是说,我认为您尝试获取的用户已经过身份验证,并提供了他/她的帐户身份(SID)声明。
答案 1 :(得分:1)
JP是对的。提供的声明包括用户所属的所有用户组的SID。这是我们的解决方案。
internal sealed class AuthorizationManager : ServiceAuthorizationManager
{
public override bool CheckAccess(OperationContext operationContext)
{
base.CheckAccess(operationContext);
ReadOnlyCollection<ClaimSet> claimSets = operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets;
ClaimSet claimSet = claimSets[0];
//is this a member of the local admins group
SecurityIdentifier adminsSid = new SecurityIdentifier("S-1-5-32-544");
foreach (var claim in claimSet.FindClaims(ClaimTypes.Sid, Rights.PossessProperty))
{
if (adminsSid.Equals(claim.Resource))
{
return true;
}
}
}
}
答案 2 :(得分:0)
我们使用发现的here代码根据登录名创建:
。进行较小的修改,您可以创建一个类似的方法,该方法根据SID返回^
:
WindowsIdentity