IHttpContextAccessor
或HttpContext
本身。
public static class HttpContextExtensions
{
public static void SignInUser(this HttpContext context)
{
await context.Authentication.SignInAsync(..);
}
public static void SignInUser(this.IHttpContextAccessor contextAccessor)
{
// Calls the method from above
contextAccessor.HttpContext.SignInUser();
}
}
或者,如果你有一個更大的依存關係鏈,並要求其他注射服務,將其轉換成可注射類:
public class UserLogonService : IUserLogonService
{
private readonly IHttpContextAccessor contextAccessor;
public UserLogonService(IHttpContextAccessor contextAccessor)
{
if(contextAccessor==null)
throw new ArgumentNullException(nameof(contextAccessor));
this.contextAccessor = contextAccessor;
}
public void SingInUser()
{
contextAccessor.HttpContext.SignInUser();
}
}
和Startup.Configure
方法:
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddSingleton<IUserLogonService, UserLogonService>();
現在你可以在項目中通過構造函數無處不在注入IUserLogonService
,即
public class MyController
{
private readonly IUserLogonService userLogon;
public MyController(IUserLoggonService userLogon)
{
this.userLogon = userLogon;
}
public async Task<IActionResult> Login()
{
await userLogon.SignInUser();
}
}
它乾淨,解耦,可以很容易地進行單元測試,這是靜態幫助器類無法做到的。
可能重複的[Access HttpContext.Current](http://stackoverflow.com/questions/31243068/access-httpcontext-current) – DavidG
您是否正在嘗試訪問用戶身份? – trevorc
@trevorc我特別試圖在幫助類中使用SignInAsync方法。 – tocoolforscool