angular - 将 cookie 添加到 Angular 中的请求并将其设置在 .NET Core 5 的背面
问题描述
我在我的应用程序 Angular 拦截器中设置了标题。
const clonedReq = req.clone({
headers: req.headers
.set('Authorization', 'Bearer ' + localStorage.getItem('accessToken')),
withCredentials: true,
});
如您所见,我设置withCredentials: true
了,但在请求中看不到任何 cookie
我的 cokies 在浏览器中看起来像这样
如果我不能在正面这样做,为什么我不能在背面设置 cookie。我是这样做的。首次启动
services.AddCors(options =>
{
options.AddPolicy("AllowAll", p =>
{
p.SetIsOriginAllowed(_ => true)
.AllowAnyHeader()
.AllowCredentials()
.AllowAnyMethod();
});
});
并在配置app.UseCors("AllowAll");
比在我的控制器中返回 Ok();
Response.Cookies.Append("key", "value", new CookieOptions()
{
Path = "/",
});
当我的 .NET Core 应用程序与 Angular 一起使用时,它已经工作了。但是当我分开两个项目时,我无法管理双方的 cookie。如何将 cookie 添加到请求并将其设置在后端?
解决方案
我有一个类似的实现并且工作正常,我希望我的代码对你拦截器有帮助:
export class TokenInterceptor implements HttpInterceptor {
constructor(private jwtAuth: JwtAuthService) {}
intercept(
req: HttpRequest<any>,
next: HttpHandler
): Observable<HttpEvent<any>> {
var token = this.jwtAuth.token || this.jwtAuth.getJwtToken();
var changedReq;
if (token) {
changedReq = req.clone({
setHeaders: {
Authorization: `Bearer ${token}`
},
});
} else {
changedReq = req;
}
return next.handle(changedReq);
}
}
在 dotnet 控制器中
[HttpPost("login")]
public async Task<IActionResult> Login(UserForLoginDto UserForLoginDto)
{
var userFromRepo = await _repo.Login(UserForLoginDto.Username.ToLower(), UserForLoginDto.Password);
if (userFromRepo == null)
return Unauthorized();
var claims = new[] {
new Claim(ClaimTypes.NameIdentifier, userFromRepo.Id.ToString()),
new Claim(ClaimTypes.Name, userFromRepo.Username)
};
var key = new SymmetricSecurityKey(Encoding.UTF8
.GetBytes(_config.GetSection("AppSettings:Token").Value));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha512Signature);
var tokenDescriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.Now.AddDays(1),
SigningCredentials = creds
};
var tokenHandler = new JwtSecurityTokenHandler();
var token = tokenHandler.CreateToken(tokenDescriptor);
var permissionList = GetCurrentRolPermission(UserForLoginDto.Username);
return Ok(new
{
token = tokenHandler.WriteToken(token),
permissionList = permissionList
});
}
我没有在后端设置 cookie 我返回一个带有 2 个属性的 json 的 OK,然后我使用该属性以角度保存 localStorage 上的凭据
推荐阅读
- ios - 使用 Swift 4 解码嵌套 JSON 只返回一个对象
- javascript - 如何通过按键访问 keyup 中的事件
- r - 分别给出月份和年份时的ggplot直方图
- react-native - 任何人都可以帮助如何在反应原生应用程序中实现视频通话功能吗?
- python - 神经网络在训练时为每个输入预测相同的输出类
- r - R包开发如何抑制依赖包生成的消息?
- c# - 按属性分组时获取“数量”的总和
- python - 要 dict 的数据框,其中一列是键,另一列是值
- reactjs - 在 @material-ui/core 下找不到 Material UI FilledInput 和 OutlinedInput 组件
- ruby-on-rails - 同一控制器中的多个路由用于发布和销毁操作?