在控制器外部使用HttpContext

toc*_*ool 1 c# httpcontext asp.net-core-mvc

public class UserAccount
{
  private readonly IHttpContextAccessor _httpContextAccessor;

  public UserAccount(IHttpContextAccessor httpContextAccessor)
  {
    _httpContextAccessor = httpContextAccessor;
  }

  //Sign in
  public static async Task SignIn(dynamic user)
  {
    var claims = new[]
    {
      new Claim("UserID", user.ID.ToString()),
      new Claim(ClaimTypes.Role, "Baller")
    };

    var principal = new ClaimsPrincipal(
          new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme));

    await _httpContextAccessor.HttpContext.Authentication.SignInAsync("Cookies", principal);
  }
}
Run Code Online (Sandbox Code Playgroud)

我从SignIn方法的await语句中收到此错误: 非静态字段,方法或属性“ UserAccount._httpContextAccessor”需要对象引用

如果我未将方法声明为静态,则错误消失,但是如果方法ISN未声明为静态,则无法从我的控制器访问UserAccount.SignIn方法。

如果我这样声明变量_httpContextAccessor

private static IHttpContextAccessor
Run Code Online (Sandbox Code Playgroud)

而不是:

private readonly IHttpContextAccessor
Run Code Online (Sandbox Code Playgroud)

所有错误都消失了,但是在await语句上又得到了空引用异常。(_httpContextAccessor未设置为对象的实例)

Tim*_*Tim 6

我想您打算看一下当前的 HttpContext。为此,您需要向其IHttpContextAccessor控制器构造函数添加一个依赖关系,然后HttpContext在您的操作方法中使用该接口的属性来访问当前上下文。

您可能需要注册

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
Run Code Online (Sandbox Code Playgroud)

在Startup.cs中,具体取决于您是否已经通过可能依赖它的其他常见服务添加了此服务。