asp.net-core - 在身份服务器 4 中成功验证后如何在应用程序级别授权用户

标签 asp.net-core asp.net-web-api asp.net-identity identityserver4

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

最佳答案

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

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

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

现在,您需要适本地构建每个应用的授权方式。这可以使用声明、角色甚至 policies 来完成。 (一种结合两者并添加更高级授权逻辑的方法)。例如,您可以在配置服务时将此添加到 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;

关于asp.net-core - 在身份服务器 4 中成功验证后如何在应用程序级别授权用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57226769/

相关文章:

c# - 如何让 ASP.NET Core 返回 XML 结果?

c# - 如何使用 asp.net core 2 测试具有属性的方法?

c# - 使用 ASP.NET MVC 属性路由验证和传递 Controller 级参数

c# - 尝试接受具有大文件的模型时出现 .net API 错误

asp.net - 如何定义多个部分 Owin Startup 类并让它们全部运行其代码

c# - 如何在 ASP NET Core 中使用 DI 注入(inject)特定接口(interface)实现

c# - FileHelper 读取以使用 web api 流式传输和下载

c# - 使用 ng-file 的 AngularJS HTTP POST

c# - 使用 asp.net 身份在身份服务器 4 中实现角色

c# - ASP.NET 核心身份种子只创建最后一个用户