如何获得WCF Claim / SecurityIdentifier(SID)的WindowsIdentity或WindowsPrincipal?

时间:2009-06-24 20:26:59

标签: wcf wif windows-identity windows-principal

我正在尝试允许管理员组中的所有用户通过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);
        }
    }
}

3 个答案:

答案 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