ASP.NET 核心 3.1 web 应用程序使用不同身份验证类型的多个区域的使用授权

ASP.NET Core 3.1 web application use authorization for multiple areas using different authentication types

我有一个 ASP.NET Core 3.1 应用程序,它遵循域驱动架构,它有 2 个区域,一个用于管理员,另一个用于客户(应用程序用户)。

我想分别为每个区域开启认证和授权。例如,将 Identity 4 用于客户区域,将基于 cookie 的身份验证用于管理区域。但它应该使用单个数据库来完成,并且不应使用基于角色的身份验证来分隔区域。

最好的方法是什么。例如“多重身份验证方案”,或任何其他方法。

当涉及到管理员和客户的登录时,您可以使用 acr_values (see definition in spec) 来实现。身份服务器可以根据 acr_values 决定如何进行身份验证,例如,如果您将 admin_login 提供为 acr_values,则身份服务器将基于该身份验证用户(使用不同的身份提供者或不同的 database/table).

在您重定向到身份服务器授权端点之前,您的应用程序需要知道用户是想以客户还是管理员身份登录。为了知道您将必须在您的应用程序中实施不同的身份验证方案(一种用于管理员,一种用于客户)。知道用户登录类型后,您可以添加正确的 acr_values。下面的代码未经测试,但它应该能让您了解如何实现它。

        services.AddAuthentication(options =>
        {
            options.DefaultScheme = "CustomerCookie";
            options.DefaultChallengeScheme = "oidc";
        })
        .AddCookie("CustomerCookie", options =>
        {
            options.Cookie.Name = "CustomerCookie";
            options.ForwardChallenge = "oidc";
        })
        .AddCookie("AdminCookie", options =>
        {
            options.Cookie.Name = "AdminCookie";
            options.ForwardChallenge = "admin-oidc";
        })
        .AddOpenIdConnect("oidc", options =>
        {
            // Configure all other options needed.

            options.SignInScheme = "CustomerCookie";
            options.CallbackPath = "/signin-oidc-customer";

            options.Events.OnRedirectToIdentityProvider = (context) =>
            {
                context.ProtocolMessage.SetParameter("acr_values", "customer_login");

                return Task.FromResult(0);
            };
        })
        .AddOpenIdConnect("admin-oidc", options =>
        {
            // Configure all other options needed.

            options.SignInScheme = "AdminCookie";
            options.CallbackPath = "/signin-oidc-admin";

            options.Events.OnRedirectToIdentityProvider = (context) =>
            {
                context.ProtocolMessage.SetParameter("acr_values", "admin_login");
                return Task.FromResult(0);
            };
        });

在身份服务器端,您可以根据 acr_values 完全控制要执行的操作,您可以使用外部提供程序进行管理。

您可以使用 IIdentityServerInteractionService.GetAuthorizationContextAsync to retrieve acr_values and you could implement IProfileService,这样一旦通过身份验证,您就可以根据用户类型(管理员或客户)决定要包含哪些声明。

这就是基本思路,希望它有用。