Как я могу получить WindowsIdentity или WindowsPrincipal Заявки / SecurityIdentifier WCF? - PullRequest
1 голос
/ 25 июня 2009

Я пытаюсь разрешить всем пользователям в группе администраторов доступ через 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 ]

3 голосов
/ 25 июня 2009

Вы должны авторизоваться. У вас есть идентификатор, который идентифицирует учетную запись, он изоморфен имени учетной записи, т. Е. SID: S-1-5-domain-500 <=> DOMAIN \ Administrator. WindowsIdentity - это пользователь, прошедший проверку подлинности.

Тем не менее, я думаю, что пользователь, которого вы пытаетесь получить, уже прошел проверку подлинности и предъявляет претензию в отношении своей учетной записи (SID).

1 голос
/ 26 июня 2009

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;
                }
            }
    }
}
0 голосов
/ 08 августа 2018

Мы используем код, который нашли здесь , чтобы создать WindowsIdentity на основе имени для входа. С незначительной модификацией вы можете создать аналогичный метод, который возвращает WindowsIdentity на основе SID:

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);
    }
}
...