c# - clientcredentialtype - wcf client certificate authentication
¿Cuál es la diferencia entre recuperar WindowsPrincipal de WindowsIdentity y Thread.CurrentPrincipal? (3)
Admito que es una solución bastante fea, pero si todo lo demás falla, podrías reemplazar:
principal = (WindowsPrincipal)Thread.CurrentPrincipal;
con algo así como
principal = new WindowsPrincipal(new WindowsIdentity(Thread.CurrentPrincipal.Identity.Name));
Si eso no funciona, al menos será instructivo para mostrar dónde van las cosas mal.
Pero no puedo imaginar que falle, ya que hace exactamente lo mismo (donde es relevante) que la línea que funcionó: Supongo que Thread.CurrentPrincipal.Identity.Name
es "ksarfo"
.
Estoy tratando de averiguar por qué la seguridad basada en atributos no funciona como esperaba en WCF y sospecho que podría tener algo que ver con lo siguiente:
AppDomain.CurrentDomain.SetPrincipalPolicy(PrincipalPolicy.WindowsPrincipal);
var identity = new WindowsIdentity("ksarfo");
var principal = new WindowsPrincipal(identity);
Console.WriteLine("/nChecking whether current user [" + identity.Name + "] is member of [" + groupName + "]");
Console.WriteLine(principal.IsInRole(groupName)); // returns true
principal = (WindowsPrincipal)Thread.CurrentPrincipal;
identity = (WindowsIdentity) principal.Identity;
Console.WriteLine("/nChecking whether current user [" + identity.Name + "] is member of [" + groupName + "]");
Console.WriteLine(principal.IsInRole(groupName)); // returns false
No entiendo por qué los resultados difieren para la llamada a la función:
principal.IsInRole(groupName)
En aras de la exhaustividad, el punto en el que realmente falla el código está aquí:
PrincipalPermission(SecurityAction.Demand, Role = "PortfolioManager")]
Ayuda apreciada.
Tal vez sea porque esta no es la misma clase.
Mire MSDN:
Entonces, si hay diferentes clases, tal vez haya diferentes implementaciones.
EDITAR:
He intentado este código:
public class InGroup
{
public string Name { get; set; }
public bool Current { get; set; }
public bool Fixe { get; set; }
public bool Thread { get; set; }
}
WindowsIdentity current = System.Security.Principal.WindowsIdentity.GetCurrent();
WindowsPrincipal principalcurrent = new WindowsPrincipal(current);
WindowsIdentity fixe = new WindowsIdentity("JW2031");
WindowsPrincipal principalFixe = new WindowsPrincipal(fixe);
IPrincipal principalThread = System.Threading.Thread.CurrentPrincipal;
List<InGroup> ingroups = new List<InGroup>();
foreach (IdentityReference item in current.Groups)
{
IdentityReference reference = item.Translate(typeof(NTAccount));
Console.WriteLine("{0}/t{1}/t{2}/t{3}",
reference.Value,
principalcurrent.IsInRole(reference.Value),
principalFixe.IsInRole(reference.Value),
principalThread.IsInRole(reference.Value));
ingroups.Add(new InGroup()
{
Name = reference.Value,
Current = principalcurrent.IsInRole(reference.Value),
Fixe = principalFixe.IsInRole(reference.Value),
Thread = principalThread.IsInRole(reference.Value)
});
}
foreach (IdentityReference item in fixe.Groups)
{
IdentityReference reference = item.Translate(typeof(NTAccount));
if (ingroups.FindIndex(g => g.Name == reference.Value) == -1)
{
ingroups.Add(new InGroup()
{
Name = reference.Value,
Current = principalcurrent.IsInRole(reference.Value),
Fixe = principalFixe.IsInRole(reference.Value),
Thread = principalThread.IsInRole(reference.Value)
});
Console.WriteLine("{0}/t{1}/t{2}/t{3}",
reference.Value,
principalcurrent.IsInRole(reference.Value),
principalFixe.IsInRole(reference.Value),
principalThread.IsInRole(reference.Value));
}
}
Y aquí está el resultado
Como puede ver, no tenía los mismos grupos con diferentes formas. Entonces (debido a que soy administrador de mi máquina local), creo que WindowsIdentity.GetCurrent obtendrá el usuario de AD y WindowsPrincipal (WindowsIdentity ("")) obtendrá el usuario de la máquina local.
En mi aplicación web, tengo la autorización más baja posible (creo). Pero no tengo explicaciones para el consoleapp ...
Solo son suposiciones, pero esto es coherente.
Creo que la diferencia está entre el usuario que inició sesión y la cuenta que ejecuta la aplicación (hilo). Estos no siempre serán lo mismo.