ASP.NET Core 2-Angular和JWT身份验证

时间:2018-06-30 18:11:06

标签: c# angular asp.net-core jwt nswag

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

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

您只能从Headers中提取引荐来源网址,但没有有关tokens的信息。

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

也许我误解了授权工作原理的概念。

最让我误解的是-ASP.NET Core如何从客户端应用程序发出的请求中提取token-必须保留在标头中?

还有,谁能分享JWT身份验证的有效示例,其中AngularASP.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;
}

Authenticate的{​​{1}}方法中,我创建了一个拥有用户ID的Claim:

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


其他信息:

  • Angular应用程序是一个单独的解决方案/项目-不是.AllowAnyOrigin() .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials() 中可用的“一个解决方案”模板。

  • 我正在使用VS2017

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

  • 这是我用来编写应用程序代码的tutorial

0 个答案:

没有答案