Как я могу получить WindowsIdentity или WindowsPrincipal утверждения WCF / SecurityIdentifier (SID)?
Я пытаюсь разрешить всем пользователям в группе администраторов доступ через 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 ответа
Вы должны подтвердить подлинность. У вас есть идентификатор, который идентифицирует учетную запись, он изоморфен с именем учетной записи, т. Е. SID: S-1-5-domain-500 <=> DOMAIN\Administrator. WindowsIdentity - это пользователь, прошедший проверку подлинности.
Тем не менее, я думаю, что пользователь, которого вы пытаетесь получить, уже прошел проверку подлинности и предъявляет право на идентификацию своего аккаунта (SID).
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;
}
}
}
}
Мы используем код, который мы нашли здесь, чтобы создать 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);
}
}