在身份服务器中成功进行身份验证后,如何在应用程序级别授权用户 4.



我有两个独立的SPA Web应用程序,一个用于AR发票,第二个用于AP发票。每个应用程序都有其数据库,其中包含允许使用该应用程序的用户列表。 每个应用程序都有其用于与其数据库交互的 ASPNET 核心 Web API。 这两个应用程序使用相同的身份服务器对用户进行身份验证,并授予使用应用程序的 API 资源的授权。 我的问题是找到在两个应用程序上实现用户权限的最佳方法。 我只应该允许在 IDP 中成功进行身份验证的用户访问 AR 发票应用程序,前提是他们存在于此应用程序的 User 表中,并且 AP 发票应用程序也是如此。 我知道我可以在身份服务器上向属于 AR 发票应用程序的不同用户添加声明,并且这些用户属于 AP 发票,但我认为这不是最好的实现,因为添加此类信息不是用户身份的一部分。 我正在考虑覆盖授权属性或添加一个策略来检查用户是否经过身份验证并存在于请求的应用程序中,但这种方法将要求应用程序检查每个 API 调用的应用程序的用户表。 您能否建议或重定向我到任何处理这种需求的教程。

如果您有身份服务器实例,则可以轻松地将 ASP.NET 身份集成到其中。然后,在您的 API(资源)中,您根本不需要用户表 - 控制器将在对身份服务器进行授权后自动提供可用的User实例。此User是一个ClaimsPrinciple,本质上是可以检查的声明集合。

编辑:提供有关答案的更多详细信息。

您提到"每个应用程序都有其数据库,其中包含允许使用该应用程序的用户列表"。我的观点是,您可以让两个应用程序的整个用户集仅驻留在身份服务器的数据库中。这将强制分离关注点 - AR/AP 应用程序仅关注 AR/AP 任务,而身份服务器将关注用户和身份验证/授权。AR/AP应用程序实际上不需要知道任何用户详细信息 - 它们应该添加Authorize属性,并假设如果用户能够输入给定的端点,则该用户已获得正确授权。

现在,您需要适当地构建每个应用程序的授权方式。这可以使用声明、角色甚至策略(一种将两者结合起来并添加更高级授权逻辑的方法)来完成。例如,您可以在配置服务时将其添加到 AP 应用程序:

public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddAuthorization(options =>
{
options.AddPolicy("CanCreateInvoice", policy =>
{
policy.RequireClaim("CreateInvoice");
policy.RequireRole("Admin");
policy.RequireUserName("user1");
⋮
});
⋮
});
}

然后,您可以将以下内容添加到 AP 应用程序终端节点:

public class InvoiceController : Controller
{
[Authorize(Policy = "CanCreateInvoice")]
public IActionResult CreateInvoice()
{
// Assume the user meets your policy requirements
// Create the invoice
};
}

这样,AP应用程序无需关注任何用户详细信息 - 它只执行与AP相关的任务。如果您需要将用户的 ID 添加到创建的发票中,您可以执行以下操作:

invoice.CreatedBy = User.FindFirst("sub").Value;

相关内容

  • 没有找到相关文章

最新更新