您還應該注意.net 4.5聲明的主要方法。 IM在VS2012使用EF5.0目標.net4.5目標.net4.5 測試WindowsIdentity.GetCurrent().Name;
和Thread.CurrentPrincipal
之間的區別我用一個小的程序是這樣下的窗體身份驗證。 因此Windows身份驗證和表單身份驗證可以一起玩。
不完全相同的情況,但它確實突出顯示了一切正常工作時忽略的重要區別。
值得一快速閱讀... 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;
}
}
}
我發現我真正的問題。 VS2012在單獨的AppDomain中運行測試,我們的數據訪問層通過Reflection進行加載。仍然不確定爲什麼EF需要委託人的知識,但我們的解決方案是在訪問EF之前將我們的委託人重置爲GenericPrincipal,然後放回原始。我仍然在想,也許一個IoC容器可以緩解這個問題。 –
您是否可以將您的調查結果添加爲答案,並將其標記爲已接受,如果它解決了問題? –