2016-09-28 81 views
0

我正在使用Microsoft.ASPNET.Identity提供程序,我想設置自定義主體。此前有FomrsAuthentication爲ASP.NET身份提供商設置自定義主體

,我會做這樣的事情:

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
    { 
     HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 

     if(authCookie != null) 
     { 
      using (var db = new GSCM.Logic.GSCMDatabase()) 
      { 
       FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value); 
       var id = new GenericIdentity(ticket.Name); 
       var principal = new VmUserLogin(id); 
       var found = db.LoadInternalUser(ticket.Name); 
       if(found != null) 
       { 
        Mapper.Map(found, principal); 
       } 

       HttpContext.Current.User = principal; 
      } 
     } 
    } 

我可怎麼辦與ientity提供商

+0

爲什麼您需要要做到這一點? –

+0

所以我有權訪問每個控制器動作中的對象,而不必每次都加載它 – dagda1

回答

0

,而不是與身份和校長打類似的東西,我會做以下:

在您的應用所需的用戶信息創建的接口

public interface ICurrentUserService 
    { 
     VmUserLogin CurrentUser{get; } 
    } 

爲您的Web項目中此界面如下

public class HttpLoggedInUserService : ICurrentUserService 
    { 
     private readonly IUserRepository _userRepository; 
     private VmUserLogin _currentUser; 

     public HttpLoggedInUserService(IUserRepository userRepository) 
     { 
      _userRepository= userRepository; 
     } 
     public VmUserLogin CurrentUser 
     { 
      get 
      { 
       if (_currentUser == null) 
       { 
        if (HttpContext.Current.Items.Contains("CurrentUser")) 
         return HttpContext.Current.Items["CurrentUser"] as VmUserLogin ; 

        var loginName = HttpContext.Current.User.Identity.Name.ToLower(); 
        _currentUser = _userRepository.GetByLoginName(loginName); 

        HttpContext.Current.Items["CurrentUser"] = _currentUser ; 
       } 

       if (_currentUser == null) 
       { 
        HttpContext.Current.Response.Redirect("/NoAccess"); 
        return null; 
       } 

       return _currentUser ; 
      } 
     } 
    } 

實現最後,你的控制器內,只需注入ICurrentUserService

public class MyController : Controller 
    { 
     private readonly ICurrentUserService _currentUserService; 

     public MyController(ICurrentUserService currentUserService) 
     { 
      _currentUserService = currentUserService; 
     } 

     public ActionResult Index() 
     { 
      return View(_currentUserService.CurrentUser); 
     } 
} 

你必須使用一個IoC容器,該解決方案將允許您將當前登錄的用戶注入到控制器,業務層甚至數據訪問層中(如果需要),並且這些層都不會知道如何回收

+0

但是之後我必須在我想要使用它的每個動作上調用它 – dagda1

+0

它將從數據庫中檢索用戶一次,並且它將被緩存對於請求生命週期中的其餘調用,如果你願意或者可能在cookie中,你也可以將它保存在會話中。 –