También debe tener en cuenta el enfoque principal de .net 4.5. Im Usando EF5.0 en VS2012 focalización .net4.5 objetivo .net4.5 prueba de la diferencia entre WindowsIdentity.GetCurrent().Name;
y Thread.CurrentPrincipal
que usar un poco de rutina de este tipo bajo formas de autenticación. Para que la Auth de Windows y la Autoformidad de formularios puedan jugar juntas.
No es exactamente la misma situación, pero resalta la diferencia importante que se pasa por alto cuando todo funciona.
Vale la pena una lectura rápida ... http://msdn.microsoft.com/en-us/library/system.security.claims.claimsprincipal.current
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Security.Principal;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Web;
namespace BosIdentityManager
{
public class BosPrincipal
{
/// <summary>
/// The current principal is set during FORMS authentication. If WINDOWS auth mode is in use, Windows sets it.
/// </summary>
/// <returns> The Name from Thread.CurrentPrincipal.Identity.Name unless alternate delegate is configured</returns>
public static string GetCurrentUserName()
{
// http://msdn.microsoft.com/en-us/library/system.security.claims.claimsprincipal.current
// with forms auth and windows integrated,ClaimsPrincipal.Current will be set.
var prin = ClaimsPrincipal.Current; //normally this reverts to Thread.CurrentPrincipal, but can chnage !
return prin.Identity.Name;
}
public static string GetCurrentWindowsUserName()
{
return WindowsIdentity.GetCurrent().Name;
}
public static void SetPrincipal(BosMasterModel.Membership memb)
{
var claims = new List<Claim>(){ new Claim(ClaimTypes.Name, memb.SystemUser.UserName),
new Claim(ClaimTypes.NameIdentifier,memb.UserId.ToString()),
new Claim(ClaimTypes.Role, "SystemUser") };
var ClaimsId = new ClaimsIdentity(claims,"Forms");
var prin = new ClaimsPrincipal(ClaimsId);
Thread.CurrentPrincipal = prin;
}
}
}
Encontré mi verdadero problema. VS2012 ejecuta las pruebas en un Dominio de aplicación separado y nuestra capa de acceso a datos se carga a través de Reflection. Todavía no estoy seguro de por qué EF requiere el conocimiento del principal, pero nuestra solución fue restablecer nuestro principal a un GenericPrincipal antes de acceder a EF y luego volver a colocar el original. Todavía estoy luchando con la idea de que tal vez un contenedor IoC alivie este problema. –
¿Puede agregar sus hallazgos como respuesta y marcarlos como aceptados si resuelve el problema? –