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,这样一旦通过身份验证,您就可以根据用户类型(管理员或客户)决定要包含哪些声明。
这就是基本思路,希望它有用。
我有一个 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,这样一旦通过身份验证,您就可以根据用户类型(管理员或客户)决定要包含哪些声明。
这就是基本思路,希望它有用。