Asp.net core ASP.NET Core 3.1 web应用程序对使用不同身份验证类型的多个区域使用授权

Asp.net core ASP.NET Core 3.1 web应用程序对使用不同身份验证类型的多个区域使用授权,asp.net-core,authentication,asp.net-core-mvc,authorization,Asp.net Core,Authentication,Asp.net Core Mvc,Authorization,我有一个ASP.NET Core 3.1应用程序,它遵循域驱动的体系结构,它有两个区域,一个用于管理,另一个用于客户(应用程序用户) 我想分别为每个区域启用身份验证和授权。例如,客户区域使用Identity 4,管理区域使用cookie base身份验证。但是应该使用单个数据库来完成,并且不应该使用角色库身份验证来分隔区域 遵循的最佳方法是什么。例如“多重身份验证方案”或任何其他方法。当涉及到管理员和客户登录时,您可以使用acr_值来实现它。Identity server可以根据acr\U值决定

我有一个ASP.NET Core 3.1应用程序,它遵循域驱动的体系结构,它有两个区域,一个用于管理,另一个用于客户(应用程序用户)

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


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

当涉及到管理员和客户登录时,您可以使用
acr_值来实现它。Identity server可以根据
acr\U值
决定如何进行身份验证,例如,如果您以
acr\U值
的形式提供了
admin\U登录
,则Identity server将根据该身份验证用户(使用不同的身份提供程序或不同的数据库/表)

在重定向到identity server授权端点之前,应用程序需要知道用户是想以客户还是管理员身份登录。为了知道您必须在应用程序中实现不同的身份验证方案(一个用于管理员,一个用于客户)。一旦知道用户登录类型,就可以添加正确的
acr\u值
。下面的代码没有经过测试,但它应该能让您了解如何实现它

        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);
            };
        });
在identity server端,您可以根据
acr\u值
完全控制要执行的操作,您可以使用外部提供程序进行管理

您可以使用来检索
acr\u值
,并且可以实现,这样一旦经过身份验证,您就可以根据用户类型(管理员或客户)决定要包含哪些声明


这将是基本的想法,希望它有用。

也许您可以使用授权。@mj1313谢谢您的回复,是的,每个区域都有自己的角色,但要求使用2个不同的登录名和不同的密码databases@Nayanajith您可以使用多功能应用系统来实现所需的解决方案。因此,管理员和客户将有一个单独的数据库。这两个人都不会访问其他数据。@Brettle感谢您的回复。不可能使用两个数据库,因为要求使用单个数据库并使用单独的登录,为每个区域注册是否可以在单个项目中同时使用Cookie身份验证和身份验证谢谢您的详细回答,这很有用