在我的网络应用程序中,登录后如何根据
UserRole
路由用户? UserRole
是从 JWT 令牌中检索的,我也将其放入 API 响应中。该令牌是由我的身份验证服务器颁发的。
如何确保路由安全?如果 JWT 被拦截,角色变为 admin,用户是否可以访问管理页面?
我在进行此类开发方面还是新手,因此非常感谢一些见解。
UserDetails userDetails = new UserDetails();
TokenResponse result = await servicex.Login(ProcEmail, ProcPassword);
if (result.Success)
{
userDetails.SetUserDetailsFromTokenResponse(result, _httpContextAccessor);
return RedirectToAction("Index", "Dashboard");
}
return View("loginPage");
在我的仪表板控制器中,我尝试了策略,但它返回“HTTP ERROR 401”错误。
public class DashboardController : Controller
{
//[Authorize(Policy = IdentityData.AdminUserPolicyName)]
public async Task<IActionResult> IndexAsync()
{
return View();
}
}
我希望基于
UserRole
的路由是安全的
身份验证:当用户登录时,将检查他们是否是 有效,他们会收到一个令牌(通常是 JWT 令牌),其中包含他们的 有效负载中的 UserRole。
授权:登录后,当用户尝试访问特定权限时 作为应用程序的一部分,系统会检查 UserRole 令牌来确定他们是否具有权限。
基于角色的重定向:基于从以下位置检索的 UserRole 令牌,应用程序逻辑决定哪个页面或控制器 用户应该被重定向到。
角色验证、令牌验证、HTTP 涉及以及使用策略保护控制器都将努力确保路由安全。
如果令牌被截获并且角色更改为管理员,用户仍然无法获得访问权限,因为应用程序中设置的机密会对它进行编码,如果角色被修改,令牌签名仍然无法被授权。
在您的代码中,您尝试添加基于角色的授权策略。 401代表未授权,这是意料之中的。因此,我启动了一个示例应用程序,您可以检查它是否有助于您的理解。主要部分是program.cs
//role-based authorization
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("UserOnly", policy => policy.RequireRole("User"));
});
在控制器中
[Route("api/fruits")]
[ApiController]
[Authorize(Policy = "UserOnly")]
public class FruitController : ControllerBase
{
[HttpGet]
public async Task<IActionResult> Get()
{
var fruits = await Task.FromResult(new string[] { "apple", "bananana", "kiwi" });
return Ok(fruits);
}
}
只有授权用户才能获得水果。
还有其他官方授权策略,例如基于声明、基于策略。更多详情可以阅读官方文档 https://learn.microsoft.com/en-us/aspnet/core/security/authorization/roles?view=aspnetcore-8.0 .