1

问题:在将令牌记录到浏览器本地存储后,我似乎无法在任何控制器中获取User或任何与用户相关的数据(例如)。UserID

我已经设置了一个断点并研究HttpContext了实例的成员ControllerBase(客户端应用程序发出请求+auth_token在此阶段保存在本地存储中)。

您只能从中提取引荐来源网址,Headers但没有关于tokens.

即使您为令牌创建了一个 cookie -Request也没有它(根本找不到 0 个 cookie)。

也许我误解了授权如何工作的概念。

这是我最误解的一点 - 如何从客户端应用程序发出的请求中ASP.NET Core获取token- 它必须保存在标头中?

此外,任何人都可以分享 JWT 身份验证的工作示例,其中Angular&ASP.NET Core是单独的解决方案吗?


我已经实现了登录功能,并将访问令牌存储在浏览器本地存储中。

this._authService.authenticate(this.loginModel)
  .finally(finallyCallback)
  .subscribe((result: AuthenticateOutput) => {
     localStorage.setItem('auth_token', result.token);
});

令牌的名称必须符合任何约定吗?(我想知道auth_token在这种情况下是否合适。)

SessionController- 获取当前用户信息的方法:

public async Task<GetCurrentLoginDetailsOutput> GetCurrentLoginDetails()
{
    var output = new GetCurrentLoginDetailsOutput();
    var user = await UserManager.GetUserAsync(HttpContext.User);
    if (user != null)
    {
        output.User = Mapper.Map<UserDto>(user);
        output.Tenant = Mapper.Map<TenantDto>(user.Tenant);
    }
    return output;
}

在我创建包含 UserID 的声明的Authenticate方法中:AuthContoller

var user = await _userService.Authenticate(input.UserName, input.Password);

var tokenDescriptor = new SecurityTokenDescriptor
{
    Issuer = _config.GetValidIssuer(),
    Audience = _config.GetValidAudience(),
    SigningCredentials = new SigningCredentials(_config.GetSymmetricSecurityKey(), SecurityAlgorithms.HmacSha256),
    Subject = new ClaimsIdentity(new[]
    {
         new Claim("id", user.Id.ToString())
    })
};

_userService.Authenticate方法获取用户并检查密码是否正确,如下所示:

var user = _context.Users.SingleOrDefault(x => x.UserName == username);

if (user == null) { return null; }

bool correctPassword = await UserManager.CheckPasswordAsync(user, password);

JWT 配置在Startup.cs

services
   .AddAuthentication()
   .AddJwtBearer(x =>
   {
      x.RequireHttpsMetadata = false;
      x.SaveToken = true;
      x.TokenValidationParameters = new TokenValidationParameters()
      {
          IssuerSigningKey = Configuration.GetSymmetricSecurityKey(),
          ValidAudience = Configuration.GetValidAudience(),
          ValidIssuer = Configuration.GetValidIssuer()
      };
});

CORS配置如下:

.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod()
.AllowCredentials()


附加信息:

  • Angular 应用程序是一个单独的解决方案/项目 - 而不是VS2017.

  • 我在用着ASP.NET Core v2.1

  • 我正在使用 NSwag.AspNetCore 包为 Angular 项目自动生成服务。

  • 这是我用来编写我的应用程序的教程。

4

0 回答 0