Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在ASP.NET Core上配置DefaultScheme和DefaultChallengeScheme有什么意义?_C#_Asp.net Core_Identityserver4_Asp.net Authentication - Fatal编程技术网

C# 在ASP.NET Core上配置DefaultScheme和DefaultChallengeScheme有什么意义?

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也可以工作,但是它是

我正在学习ASP.NET Core 2.0和IdentityServer 4上的安全机制。我使用IdentityServer、API和ASP.NET核心MVC客户端应用程序设置项目

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
    ClaimsPrincipal
    ),并以某种方式保持该用户身份。例如,在cookie身份验证方案上对用户进行登录基本上将创建一个包含该用户身份的cookie

  • 注销:这与登录相反,基本上会告诉身份验证方案删除该持久性。签出cookie方案将有效地使cookie过期

请注意,并非所有身份验证方案都可以执行所有选项。登录和注销通常是特殊操作。cookie身份验证方案是一个支持登录和注销的示例,但例如OIDC方案无法做到这一点,而是将依赖不同的方案来登录和保留身份。这就是为什么您通常也会看到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;
});