Bạn cũng nên lưu ý phương pháp tiếp cận chính của. 4.5. Im Sử dụng EF5.0 trên VS2012 nhắm mục tiêu .net4.5 mục tiêu .net4.5 kiểm tra sự khác biệt giữa WindowsIdentity.GetCurrent().Name;
và Thread.CurrentPrincipal
tôi sử dụng một thói quen nhỏ như dưới đây HÌNH THỨC auth. Vì vậy, Windows Auth và Forms Auth có thể chơi cùng nhau.
Không giống hoàn cảnh chính xác, nhưng nó làm nổi bật sự khác biệt quan trọng bị bỏ qua khi mọi thứ hoạt động.
Worth thể đọc nhanh ... 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;
}
}
}
Nguồn
2012-10-05 03:33:31
Tôi đã tìm thấy vấn đề thực sự của mình. VS2012 chạy các thử nghiệm trong một AppDomain riêng biệt và lớp truy cập dữ liệu của chúng tôi tải thông qua Reflection. Vẫn không chắc chắn lý do tại sao EF yêu cầu kiến thức về hiệu trưởng nhưng giải pháp của chúng tôi là đặt lại hiệu trưởng của chúng tôi cho một GenericPrincipal trước khi truy cập EF rồi đặt lại bản gốc. Tôi vẫn vật lộn với ý nghĩ rằng có lẽ một container IoC sẽ làm giảm bớt vấn đề này. –
Bạn có thể thêm phát hiện của mình làm câu trả lời và đánh dấu chúng là được chấp nhận nếu nó giải quyết được sự cố không? –