首页 > 解决方案 > ASP.net MVC Core 和 IdentityServer 4:在 AddAuthentication 中设置 defaultScheme

问题描述

我正在查看下面的代码。AddAuthentication 添加了带有“Cookies”的 defaultScheme。这是否意味着当前的mvc应用默认只接受Cookie认证而不接受Access Token。

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(AuthenticationSchemes = 
    JwtBearerDefaults.AuthenticationScheme)]

这仅适用于 Accesstoken,如果我需要两者,我也添加 cookie

标签: authenticationasp.net-coreaccess-tokenidentityserver4

解决方案


options.DefaultScheme = "Cookies";

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

options.DefaultChallengeScheme = "oidc";

这意味着如果没有另外指定,默认的质询认证方案将是"oidc".

这就是 OIDC 和 Cookie 身份验证方案通常如何相互配合的方式:应用程序将尝试使用现有 cookie 对用户进行身份验证。如果失败(因为没有 cookie),则将使用 OIDC 方案进行身份验证质询。然后,这会将身份验证传递给外部提供商,当验证成功时,OIDC 方案将使用 Cookie 身份验证方案将用户登录。这会创建 cookie,因此在下一次请求时,cookie 身份验证方案将能够对用户进行身份验证(无需再次询问 OIDC 方案)。

如果您希望其他身份验证方案起作用,那么您也必须添加它们。AddAuthentication(…).AddCookie(…).AddOpenIdConnect(…)只会设置这个链。如果您还需要 JWT 不记名身份验证,则还需要对其进行配置。

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

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


推荐阅读