问题:在将令牌记录到浏览器本地存储后,我似乎无法在任何控制器中获取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;
}
在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。