razor - 如何使用来自“外部登录”的声明向 razor PageModel 的“ClaimsPrincipal User”添加声明身份
问题描述
在我们的 razor 页面的帖子中,我们调用了一个 Api 方法来登录用户,这个 Api 方法返回一个带有一些声明的 JTW。登录成功后,我们尝试将此声明放在基类的User
属性上PageModel
,但是当我们尝试在另一个页面上访问此声明时,此声明不再可用。
方法:
public async Task<IActionResult> OnPostAsync()
{
var jwtToken = await _externalApi.Execute<string>($"/auth/", Method.POST, jsonBody: myCredentialsObject);
var handler = new JwtSecurityTokenHandler();
var securityToken = handler.ReadJwtToken(jwtToken);
User.AddIdentity(new ClaimsIdentity(securityToken.Claims, "myClaims"));
Response.Cookies.Append("bearer", jwtToken);
return LocalRedirect("/user/index");
return Page();
}
登录页面:
另一个页面:
每次http请求后“重置”User
属性?这种方法可行吗?
解决方案
经过一番研究,在这种情况下,我们需要创建一个新的ClaimsPrincipal
并“重写”auth cookie,HttpContext.SignInAsync(...)
方法是应用新ClaimsPrincipal
的 services.AddAuthentication(...)
中间件可以User
为我们设置属性。
像这样的东西:
启动类:
public class Startup
{
// Omitted for brevity...
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, cookieAuthOptions =>
{
cookieAuthOptions.Cookie.Name = "MyApplicationCookie";
cookieAuthOptions.LoginPath = "/signIn";
cookieAuthOptions.LogoutPath = "/signOut";
cookieAuthOptions.AccessDeniedPath = "/accessDenied";
});
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Omitted for brevity...
app.UseAuthentication();
}
}
登录页面:
public async Task<IActionResult> OnPostAsync()
{
var signinResult = await _aiguiApi.Execute<string>($"/auth/", Method.POST, jsonBody: SignInInputModel);
var jwt = signinResult.Value.ToString();
var handler = new JwtSecurityTokenHandler();
var token = handler.ReadJwtToken(jwt);
// THIS CODE HERE, MAKE THE "MAGIC"...
var userPrincipal = new ClaimsPrincipal(
new ClaimsIdentity(token.Claims, "myClaims")
);
await HttpContext.SignInAsync(userPrincipal);
//...
Response.Cookies.Append("bearer", jwt);
return LocalRedirect("/user/index");
return Page();
}
另一个页面:
就是这样,伙计们!
推荐阅读
- postgresql - Yii2:如何为我的模型添加检查约束?
- cakephp - 将 VueJS 与 CakePHP 3 集成的最佳实践
- php - 使用 PHP 提取 JSON 数据
- ruby - 替代转义的外壳字符串?
- ios - unity ios 使用 https 无法进行休息标注
- python - Pandas 将行分配给匹配行的索引
- c# - 如果您知道居中坐标,请在图片上创建相等的框
- php - 无法将表单中的数据插入 MySQL;用 PHP
- ruby-on-rails - 使用haml将coffeescript放置在rails视图上的ruby末尾时收到语法错误
- s4sdk - Cloud-SDK 按子字段过滤