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

时间:2018-04-29 22:52:35

标签: 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 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

1 个答案:

答案 0 :(得分:2)

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承载认证。但是它可以与已经设置的Cookie / OIDC设置并行工作。