Si dovrebbe anche notare l'approccio principale di rivendicazioni .net 4.5. Im Utilizzando EF5.0 su VS2012 mira .net4.5 obiettivo .net4.5 prova la differenza tra WindowsIdentity.GetCurrent().Name;
e Thread.CurrentPrincipal
Io uso un po 'di routine come questo sotto FORMA auth. Quindi Auth Auth di Windows e Form può giocare insieme.
Non esattamente la stessa situazione, ma evidenzia l'importante differenza che viene trascurata quando tutto funziona correttamente.
Merita una lettura veloce ... 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;
}
}
}
fonte
2012-10-05 03:33:31
Ho trovato il mio vero problema. VS2012 esegue i test in un AppDomain separato e il livello di accesso ai dati viene caricato tramite Reflection. Ancora non sono sicuro del motivo per cui EF richiede la conoscenza del principale, ma la nostra soluzione è stata quella di ripristinare il nostro principio su GenericPrincipal prima di accedere a EF e quindi rimettere l'originale. Sto ancora lottando con il pensiero che forse un container IoC potrebbe alleviare questo problema. –
Puoi aggiungere i risultati come risposta e contrassegnarli come accettati se risolvono il problema? –