我有一个.net core 2.2 api,该API生成(成功登录后)一个JWT令牌,该令牌包含声明身份,身份声明身份传递诸如身份验证用户的用户名,权限和角色之类的信息。
在我的.net core 2.2中。网络应用程序中,我有一个登录机制,该机制可以通过控制器的用户检索JWT令牌。
我的问题是
如何从登录控制器内部扩展令牌并设置Web应用程序以包括对User.Identity.IsAuthenticated
,User.IsInRole("Admin")
等身份验证机制以及[Authorize]
和[Authorize(Roles="Admin")]
我已被引导去查看外部身份验证提供程序(例如facebook / google)背后的源代码,但无济于事。
谢谢。
答案 0 :(得分:2)
第一步是在cookie authentication
中使用Startup.cs
:
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
在Configure
方法中,使用UseAuthentication
方法调用设置HttpContext.User属性的身份验证中间件。在调用UseMvcWithDefaultRoute
或UseMvc
之前,先调用UseAuthentication方法:
app.UseAuthentication();
然后在您的auth控制器中,获取令牌并进行解码以获取声明后,您应该创建新的ClaimsIdentity
,添加声明并登录用户:
if (!User.Identity.IsAuthenticated)
{
var identity = new ClaimsIdentity(CookieAuthenticationDefaults.AuthenticationScheme, ClaimTypes.Name, ClaimTypes.Role);
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, YourName));
identity.AddClaim(new Claim(ClaimTypes.Name, YourName));
identity.AddClaim(new Claim(ClaimTypes.Role, "Admin"));
//Add your custom claims
var principal = new ClaimsPrincipal(identity);
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal, new AuthenticationProperties { IsPersistent = true });
}
之后,您可以使用User.Identity.IsAuthenticated
,User.IsInRole("Admin")
和[Authorize(Roles="Admin")]
:
[Authorize(Roles = "Admin")]
public IActionResult About()
{
var result = User.IsInRole("Admin");
return View();
}