Asp.Net Core Web API 5.0 和 Angular 中基于自定义角色的授权

Posted

技术标签:

【中文标题】Asp.Net Core Web API 5.0 和 Angular 中基于自定义角色的授权【英文标题】:Custom role based Authorization in Asp.Net Core Web API 5.0 & Angular 【发布时间】:2021-11-26 21:49:36 【问题描述】:

我有一个已经存在的数据库,其中包含两个表,例如用户详细信息、用户角色。每个用户可以有许多自定义角色。我有一个 Angular UI 应用程序,当 UI 调用任何控制器中的任何操作方法时,我将如何检查用户角色以检查授权?注意-:UI 会在每个请求中向我发送用户 ID。我不想使用 Asp.Net Identity 进行用户授权。在这种情况下如何进行? 我是否需要在每个需要授权的操作方法中查询数据库并获取用户的角色?

【问题讨论】:

您的 Angular 用户界面如何实现登录操作?我的意思是当用户登录时,你可以在会话中保存用户 id、用户角色或使用 redis 将这些数据保存在内存中。 登录时,我们通过查询数据库将用户角色发送到 UI,并且 UI 将这些角色存储在共享服务中。但在其他 Api 调用期间,UI 会向我发送登录用户的用户 ID。我必须根据用户 ID 确定分配给用户的角色。 这种调用加个过滤器怎么样,过滤器里面可以查询数据库获取用户角色然后把角色保存到会话中,在过滤器方法中检查会话在查询数据库之前。 【参考方案1】:

我建议使用 JSON Web 令牌 (JWT)。您无需使用 ASP.NET 标识即可使用 JWT。当用户登录时,在服务器上创建一个 JWT,其中包含他们的身份和角色,然后将其传递回您的 Angular 客户端。

然后,客户端需要将 JWT 与每个服务请求一起传递到一个类似于以下内容的标头中:

 "Authorization": "bearer <your token>" 

这样,您的服务代码就不需要在每次请求时都在数据库中查找用户。它也更安全,因为正确签名的 JWT 不会被黑客入侵,而如果您只是传递一个未加密的 UserId,有人可以轻松地在 Chrome 开发工具中设置断点,然后手动更改为他们想要的任何内容。

查看Using Bearer/Jwt authorization without Identity 和https://blog.angular-university.io/angular-jwt-authentication/。

祝你好运!

【讨论】:

其实我知道我们可以在jwt中添加声明。但问题是,我无法在 jwt 中公开用户角色。 当你说不能在 JWT 中公开用户角色时,你到底是什么意思? 我的意思是说,如果您将用户角色作为声明附加到您的 jwt,那么如果您转到 jwt.io 并解码有效负载,那么您将能够看到这些声明。跨度> 是的,确实如此。但是在不使签名失效的情况下,无法在客户端更改声明,因此只要您在服务器上验证签名,您就知道它是合法的。

以上是关于Asp.Net Core Web API 5.0 和 Angular 中基于自定义角色的授权的主要内容,如果未能解决你的问题,请参考以下文章

Asp.Net Core Web API 5.0 和 Angular 中基于自定义角色的授权

为 ASP.NET Core 5.0 - EF Core 5.0 Web App 配置 PostgreSQL 连接字符串以在 MS 或 Linux 云上运行?

从 Azure 中托管的 ASP.NET Core 5.0 MVC 站点调用 API/服务的间歇性套接字异常

ASP.NET Core 5.0 JWT 身份验证引发 401 代码 [重复]

ASP.NET Core 5.0 WebAPI 中的多种身份验证方案

不可接受的响应 (406) 消息 Asp.NET 代码 Web API (C#) - .NET 5.0