C# 在ASP.NET Core上配置DefaultScheme和DefaultChallengeScheme有什么意义?
我正在学习ASP.NET Core 2.0和IdentityServer 4上的安全机制。我使用IdentityServer、API和ASP.NET核心MVC客户端应用程序设置项目C# 在ASP.NET Core上配置DefaultScheme和DefaultChallengeScheme有什么意义?,c#,asp.net-core,identityserver4,asp.net-authentication,C#,Asp.net Core,Identityserver4,Asp.net Authentication,我正在学习ASP.NET Core 2.0和IdentityServer 4上的安全机制。我使用IdentityServer、API和ASP.NET核心MVC客户端应用程序设置项目 ConfigureService客户端应用程序上的方法,如下所示。这里我混淆了DefaultScheme和DefaultChallengeScheme。配置它们的意义是什么?如果可能的话,对其工作原理的详细描述将非常有用 我已经看到,DefaultScheme,defaultsignnscheme也可以工作,但是它是
ConfigureService
客户端应用程序上的方法,如下所示。这里我混淆了DefaultScheme
和DefaultChallengeScheme
。配置它们的意义是什么?如果可能的话,对其工作原理的详细描述将非常有用
我已经看到,DefaultScheme
,defaultsignnscheme
也可以工作,但是它是如何工作的呢?这些有什么区别
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
//options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
//options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie("Cookies")
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.SignInScheme = "Cookies";
options.RequireHttpsMetadata = false;
options.Authority = "http://localhost:5000/";
options.ClientId = "mvcclient";
options.SaveTokens = true;
});
}
首先请注意,您没有使用ASP.NET核心标识。标识是构建在身份验证系统之上的用户管理堆栈。您似乎正在使用OpenID Connect和IdentityServer作为提供程序,因此您的web应用程序将只使用OIDC信息,而不必管理自己的标识(但IdentityServer可能正在使用ASP.NET核心标识) 身份验证堆栈在ASP.NET Core中的工作方式是,您可以配置一组身份验证方案。其中一些方案旨在组合使用,例如cookie认证方案很少单独使用,但也有一些方案可以完全单独使用(例如JWT承载认证) 身份验证操作 在身份验证世界中,您可以执行某些操作:
- 验证:验证基本上意味着使用给定的信息并尝试使用该信息验证用户。因此,这将尝试创建一个用户标识,并使其可用于框架
例如,cookie身份验证方案使用cookie数据来恢复用户身份。或者JWT承载身份验证方案将使用作为请求中
头的一部分提供的令牌来创建用户身份授权
- 挑战:当验证方案受到挑战时,该方案应提示用户进行自我验证。例如,这可能意味着用户被重定向到登录表单,或者将重定向到外部身份验证提供程序
- 禁止:当一个身份验证方案被禁止时,该方案基本上只会做出响应,告诉用户他们可能不会做任何他们试图做的事情。这通常是一个错误,可能是重定向到某个错误页面
- 登录:在登录身份验证方案时,该方案被告知接受现有用户(a
),并以某种方式保持该用户身份。例如,在cookie身份验证方案上对用户进行登录基本上将创建一个包含该用户身份的cookieClaimsPrincipal
- 注销:这与登录相反,基本上会告诉身份验证方案删除该持久性。签出cookie方案将有效地使cookie过期
登录“cookie”
,您可以从代码中这样简单地调用它:
var user = new ClaimsPrincipal(…);
await httpContext.SignInAsync(user, "Cookie");
但在实践中,像这样直接、明确地调用身份验证并不是最常见的做法。相反,您通常会依赖框架为您进行身份验证。为此,框架需要知道在什么操作中使用哪个身份验证方案
这就是我们的目的。您可以配置这些选项,以便明确定义要用作每个身份验证操作的默认身份验证方案:
- :设置进行身份验证时要使用的默认方案
- :设置挑战时要使用的默认方案
- :设置禁止访问时使用的默认方案
- :设置要登录的默认方案
- :设置要注销的默认方案
- :设置默认的回退方案(见下文)
- 验证:
或DefaultAuthenticateScheme
DefaultScheme
- 挑战:
,或DefaultChallengeScheme
DefaultScheme
- 禁止:
,或defaultbanbidscheme
,或DefaultChallengeScheme
DefaultScheme
- 登录:
,或defaultsignnscheme
DefaultScheme
- 注销:
或DefaultSignOutScheme
DefaultScheme
DefaultScheme
。因此,您通常会看到正在配置的DefaultScheme
,然后针对需要不同方案的情况配置特定操作
您的示例很好地说明了这一点:使用OIDC,您将需要一个能够持久化标识的登录方案
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
});