2016-02-13 18 views
2

在MVC5中,我通過覆蓋控制器中的Initialize方法將當前登錄用戶的ID初始化爲私有文件。獲取當前在控制器構造函數中登錄的用戶ID ASP.NET 5 MVC6

public class BaseControllerConstructor: Constructor 
{ 
    protected UserProfile _currentUserProfile; 

    protected override void Initialize(RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 

     if (User.Identity.IsAuthenticated) 
     { 
      _currentUserId = User.Identity.GetUserId(); 
      _currentUserProfile = LoadUserProfile(_currentUserId); 
     } 
    } 
} 

在MVC6控制器中沒有Initialize

當我嘗試在構造函數中獲取當前登錄用戶的ID時,UserHttpContextnull

public BaseControllerConstructor() 
{ 
    // HttpContext is null  
    string _currentUserId = HttpContext.User.GetUserId(); 
    _currentUserProfile = LoadUserProfile(_currentUserId); 
} 

我該如何在MVC6中實現這一目標?特別是:如何獲取當前登錄用戶的用戶ID,並在BaseControllerConstructor中初始化_currentUserId

然後在控制器的動作只要致電:

class Controller: BaseControllerConstructor 
{ 
    public ActionResult Action() 
    { 
     foo(_currentUserProfile); 
    }  
} 

更新:我解決了這個使用依賴注入。請看下面的答案。

回答

5

我已經解決了這個使用依賴注入和IHttpContextAccessor類訪問HttpContext.User

執行註冊爲Startup.cs的服務。

// The interface for the service. 
public interface IAccountService 
{ 
    User CurrentUser { get; } 
    string CurrentUserId { get; } 
} 

// The class which implements the interface 
public class AccountService : IAccountService 
{ 
    private IHttpContextAccessor _httpContextAccessor; 

    // This is a custom services which has access to the business model and the data model 
    private IUserService _userService; 
    private string _currentUserId; 
    private User _currentUser; 

    public AccountService(IHttpContextAccessor httpContextAccessor, IUserService currentUser) 
    { 
     _httpContextAccessor = httpContextAccessor; 
     _coreServiceProvider = coreServiceProvider; 
     _currentUserId = null; 
     _currentUser = null; 
    } 

    public User CurrentUser 
    { 
     get 
     { 
      if (_currentUser != null) 
      { 
       return _currentUser; 
      } 

      if (string.IsNullOrEmpty(_currentUserId)) 
      { 
       // Get the user ID of the currently logged in user. 
       // using System.Security.Claims;      
       _currentUserId = _httpContextAccessor.HttpContext.User.GetUserId(); 
      } 

      if (!string.IsNullOrEmpty(_currentUserId)) 
      { 
       _currentUser = _userService.Find(_currentUserId); 
       if (_currentUser == null) 
       { 
        string errMsg = string.Format("User with id {0} is authenticated but no user record is found.", _currentUserId); 
        throw new Exception(errMsg); 
       } 
      } 

      return _currentUser; 
     } 
    } 

    public string CurrentUserId 
    { 
     get 
     { 
      if (!string.IsNullOrEmpty(_currentUserId)) 
      { 
       return _currentUserId; 
      } 

      // Get the user ID of the currently logged in user. 
      // using System.Security.Claims; 
      _currentUserId = _httpContextAccessor.HttpContext.User.GetUserId(); 

      return _currentUserId; 
     } 
    } 
} 

類註冊服務Startup方法ConfigureServices

public class Startup 
{ 
    public void ConfigureServices(IServiceCollection services) 
    { 
     // Add framework services. 
     services.AddEntityFramework() 
      .AddSqlServer() 
      .AddDbContext<ApplicationDbContext>(options => 
       options.UseSqlServer(Configuration["Data:DefaultConnection:ConnectionString"])); 

     services.AddIdentity<ApplicationUser, IdentityRole>() 
      .AddEntityFrameworkStores<ApplicationDbContext>() 
      .AddDefaultTokenProviders(); 

     services.AddMvc(); 

     // Register UserService a custom class which has access to the user profiles 
     // This is injected. 
     services.AddScoped<IUserService, UserService>(); 

     // Register the IAccountService which is injected in the controller 
     services.AddScoped<IAccountService, AccountService>(); 
    } 
} 
相關問題