ASP.net MVC Core和IdentityServer 4:在AddAuthentication中设置defaultScheme

ASP.net MVC Core和IdentityServer 4:在AddAuthentication中设置defaultScheme,authentication,asp.net-core,access-token,identityserver4,Authentication,Asp.net Core,Access Token,Identityserver4,我正在看下面的代码。AddAuthentication添加了带有“Cookies”的defaultScheme。这是否意味着默认情况下,当前mvc应用程序只接受Cookie身份验证,而不接受访问令牌 services.AddOptions(); //services.Configure(Configuration); services.AddDistributedMemoryCache(); // Adds a default in-memory implementation of IDistr

我正在看下面的代码。AddAuthentication添加了带有“Cookies”的defaultScheme。这是否意味着默认情况下,当前mvc应用程序只接受Cookie身份验证,而不接受访问令牌

services.AddOptions();
//services.Configure(Configuration);
services.AddDistributedMemoryCache(); // Adds a default in-memory implementation of IDistributedCache
services.AddSession();

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

services.AddAuthentication(options =>
{
    options.DefaultScheme = "Cookies";
    options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
目前,我想用我的移动应用程序访问一个页面,该应用程序通过从应用程序本身登录的访问令牌进行身份验证。 我想知道如何使用AccessToken而不是Cookie来请求webview中的网页

我可以传入一个名为Authorize的属性,它具有可接受的差异方案。我想知道这是设置它的方式吗

[Authorize(AuthenticationSchemes = 
    JwtBearerDefaults.AuthenticationScheme)]
这只适用于Accesstoken,如果我需要这两个,我也会添加cookie

options.DefaultScheme = "Cookies";
这意味着,如果没有另外指定,则身份验证方案将是
“Cookies”

这意味着,如果没有另外指定,默认质询身份验证方案将是
“oidc”

这就是OIDC和Cookie身份验证方案通常相互作用的方式:应用程序将尝试使用现有Cookie对用户进行身份验证。如果失败(因为没有cookie),那么将使用OIDC方案进行身份验证质询。然后,这将把身份验证转发给外部提供者,当验证成功时,OIDC方案将使用Cookie身份验证方案为用户签名。这将创建cookie,因此在下一个请求中,cookie身份验证方案将能够对用户进行身份验证(无需再次询问OIDC方案)

如果您想让其他身份验证方案工作,那么您也必须添加这些方案
AddAuthentication(…).AddCookie(…).AddOpenIdConnect(…)
将只设置此链。如果您还需要JWT承载身份验证,那么还需要对其进行配置

但是,仅仅因为您
.AddJwtBearer(…)
,这并不意味着正常流的任何内容都会改变:Cookie方案仍然是默认的,而OIDC方案仍然是默认的挑战。正如我上面所说:除非你另有说明

因此,当您想要使用JWT承载身份验证对用户进行授权时,您需要显式地触发它。正如您自己所注意到的,这可以使用
Authorize
属性来完成。但为了使其工作,您仍然必须正确设置JWT承载身份验证。但是,它可以与已经设置好的Cookie/OIDC设置并行工作

这意味着,如果没有另外指定,则身份验证方案将是
“Cookies”

这意味着,如果没有另外指定,默认质询身份验证方案将是
“oidc”

这就是OIDC和Cookie身份验证方案通常相互作用的方式:应用程序将尝试使用现有Cookie对用户进行身份验证。如果失败(因为没有cookie),那么将使用OIDC方案进行身份验证质询。然后,这将把身份验证转发给外部提供者,当验证成功时,OIDC方案将使用Cookie身份验证方案为用户签名。这将创建cookie,因此在下一个请求中,cookie身份验证方案将能够对用户进行身份验证(无需再次询问OIDC方案)

如果您想让其他身份验证方案工作,那么您也必须添加这些方案
AddAuthentication(…).AddCookie(…).AddOpenIdConnect(…)
将只设置此链。如果您还需要JWT承载身份验证,那么还需要对其进行配置

但是,仅仅因为您
.AddJwtBearer(…)
,这并不意味着正常流的任何内容都会改变:Cookie方案仍然是默认的,而OIDC方案仍然是默认的挑战。正如我上面所说:除非你另有说明


因此,当您想要使用JWT承载身份验证对用户进行授权时,您需要显式地触发它。正如您自己所注意到的,这可以使用
Authorize
属性来完成。但为了使其工作,您仍然必须正确设置JWT承载身份验证。但是它可以与已经设置好的Cookie/OIDC设置并行工作。

您需要使用
AddJwtBearer(options=>{…})
到您的身份验证方法以使用访问令牌。这会影响使用访问令牌访问的所有页面吗?您需要使用
AddJwtBearer(选项=>{…})
到您的身份验证方法以使用访问令牌。这是否会影响使用访问令牌访问的所有页面?我对此非常陌生。。有一个简单的设置可以看吗?你可以在这里学习任何关于ASP.NET核心的JWT承载身份验证教程。例如,我对这个很陌生。。有一个简单的设置可以看吗?你可以在这里学习任何关于ASP.NET核心的JWT承载身份验证教程。例如
options.DefaultChallengeScheme = "oidc";