[英]How to implement role-based authorization in Blazor WASM without modifying Identity Server code
在发布这个问题之前,我在 Internet 上进行了大量研究,我找到了一些东西,但我找不到适合我的情况的东西。 因此,请为我提供正确的方向或代码片段。
我正在.NET 6 中开发一个应用程序,它由两个项目组成:客户端的Blazor WASM项目和我的应用程序 API 的WEB-API 项目。
目前,我已经成功地从中央身份服务器 4实现了身份验证。 我收到“id_token”和“access_token”,并使用它们来保护未经身份验证的用户对我的 Web API 的访问。
问题是现在我想实现“基于角色的授权”。 事实是:
我认为这里正确的解决方案是实现一个MIDDLEWARE ,它从我的数据库中读取角色并将它们添加到“声明”中。
我应该在哪里开发中间件? Web-Api 项目,blazor 项目或两者兼而有之???
如果我在 Web-Api 项目中开发了一个中间件(默认情况下已经有一个管道),它将角色添加到“access_token”的声明中,那么 blazor 项目将无法工作,因为修改了令牌,对吧???
您能帮我提供代码片段或提供正确的方向吗?
感谢您的时间!!!
客户端在每个请求中发送 access_token。 服务器验证 access_token,然后使用包含在令牌中的声明创建 ClaimsPrincipal。 在您的服务器中,可以使用 OnTokenValidated 事件向 ClaimsPrincipal 添加其他声明。 例子:
.AddJwtBearer("Bearer", options =>
{
options.Events = new JwtBearerEvents
{
OnTokenValidated = async context =>
{
var user = context.Principal;
var userId = user.FindFirstValue(ClaimTypes.NameIdentifier);
// Get DbContext. If you don't use Entity Framework request your own data access service.
//var dbContext = context.HttpContext.RequestServices.GetRequiredService<AppDbContext>();
// Retrieve user roles from database and create a list of role claims.
var claims = new List<Claim>
{
new Claim(ClaimTypes.Role, "admin")
};
var claimsIdentity = new ClaimsIdentity(claims);
user.AddIdentity(claimsIdentity);
await Task.CompletedTask;
}
};
});
然后在您的控制器中,您可以使用[Authorize(roles = "admin")]
或User.IsInRole("admin");
检查角色 .
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.