问题:在将令牌记录到浏览器本地存储后,我似乎无法在任何控制器中获取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 项目自动生成服务。
这是我用来编写我的应用程序的教程。