1

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

3 回答 3

3

您必须进行身份验证。您有一个标识帐户的标识符,它与帐户名称同构,即 SID:S-1-5-domain-500 <=> DOMAIN\Administrator。WindowsIdentity 是经过身份验证的用户。

也就是说,我认为您尝试获取的用户已经过身份验证,并且正在提供他/她的帐户身份 (SID) 的声明。

于 2009-06-24T21:06:58.510 回答
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;
                }
            }
    }
}
于 2009-06-26T13:10:04.330 回答
0

我们正在使用我们在此处找到的代码来创建WindowsIdentity基于登录名的代码。稍作修改,您就可以创建一个类似的方法,该方法WindowsIdentity基于 SID 返回 a:

public static WindowsIdentity GetWindowsIdentityBySid(string sid)
{
    using (var user =
        UserPrincipal.FindByIdentity(
        UserPrincipal.Current.Context,
        IdentityType.Sid,
        sid
        ))
    {
        return user == null
            ? null
            : new WindowsIdentity(user.UserPrincipalName);
    }
}
于 2018-08-08T08:34:50.733 回答