因此,我试图使用ASP.NET Core 3.1实现一个OIDC客户端应用程序。我试图利用.AddOpenIdConnect()
和.AddJswtBearer()
中间件。然而,我需要一些关于这个中间件是做什么的澄清。
下面是我目前的中间件配置:
.AddOpenIdConnect(options =>
{
options.Authority = Configuration["auth:oidc:authority"];
options.ClientId = Configuration["auth:oidc:clientid"];
options.ClientSecret = Configuration["auth:oidc:clientsecret"];
options.ResponseType = OpenIdConnectResponseType.Code;
options.GetClaimsFromUserInfoEndpoint = true;
options.SaveTokens = true;
})
.AddJwtBearer(options =>
{
options.Authority = Configuration["auth:oidc:authority"];
options.Audience = Configuration["auth:oidc:clientid"];
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidIssuer = Configuration["auth:oidc:authority"],
ValidAudience = Configuration["auth:oidc:clientid"],
ValidateIssuerSigningKey = true,
ClockSkew = TimeSpan.Zero
};
}
我注意到,根据下面的Fiddler捕获,在应用程序首次启动时会请求对授权服务器的/.well-known/oidc-configuration
和/.well-known/keys
端点的请求
它在哪里做的?
我还尝试验证从授权服务器接收的JWT是否有效(从服务器发送到客户端接收的这段时间内没有被篡改过)。当我在.AddJwtBearer()
中间件中添加TokenValidationParameters
对象时,我就知道会发生这种情况。为了测试这一点,我尝试将TokenValidationParameters
中的Valid Audience
更改为类似asdkwewrj
的内容,我知道这不是我令牌的有效受众。但是,我从未从客户端收到错误,说受众无效。身份验证仍然有效,我仍然能够访问我的安全 Jmeter 板。
另一个我尝试在这个OIDC客户端实现的是refresh_token grant_type。我以为.AddOpenIdConnect()
中间件中的options.saveTokens
允许我保存令牌。看起来它们被保存为cookie,但这些cookie看起来一点也不像我的令牌值(我的访问令牌是JWT,但在我看到的cookie中,没有一个以ey
开始)。
简而言之,我试图理解以下内容:
1.如果我定义了正确的JwtBearerOptions
,这个.AddJwtBearer()
中间件是否会为我验证ID令牌(就像我上面所做的那样)?或者我是否需要根据JWKs URI手动验证JWKs的ID令牌?
1.如果我必须使用JWKs URI中的JWKs手动验证ID令牌,那么当中间件向/.well-known/keys
端点发出请求时,我如何存储这些JWKs?
1.如何获取与访问令牌和刷新令牌对应的cookie,然后将刷新令牌发送到我的授权服务器?
1.我注意到我可以在这两个中间件中使用选项。事件。它们中的任何一个能解决我试图完成的任何项目吗?
1.总的来说,这两个中间件为我处理了什么,我不需要手动做(即令牌验证和/或令牌更新)?
谢谢!我对ASP.NET这样的深度开发还是相当陌生的,所以我很感激任何回应。
2条答案
按热度按时间ds97pgxw1#
首先OIDC认证方案和JWT承载认证方案是彼此独立的。OIDC主要用于服务器端认证,并且几乎从不单独使用,而是总是与cookie方案一起使用。其原因是OIDC方案将仅用于认证,但不能单独保存信息。我已经详细介绍了in a different answer of mine,它还解释了身份验证流程如何与OIDC一起工作。
至于JWT承载,这个认证方案将在 * 每一个 * 请求上运行,因为它是完全无状态的,并且期望客户端一直使用
Authorization
头部来认证自己。这使得它主要用于保护API,因为浏览器无法为正常的浏览器请求提供JWT。所以你应该先问问自己,你是在保护你的服务器端Web应用程序(例如使用Razor视图或Razor页面),在这种情况下,你想使用OIDC和cookie身份验证方案,还是在保护你的API。当然,答案可能是“两者”,在这种情况下,你想所有这三种方案,但ASP.NET Core将不支持这一点,没有进一步的配置。
澄清了这一点,让我们进入你的问题:
1.对
/.well-known/oidc-configuration
和/.well-known/keys
的请求由OIDC和JWT承载方案完成,以便从您的身份提供者检索信息。他们会定期更新他们的数据,包括有关他们将用于验证令牌的签名密钥的信息。这发生在方案处理程序中,通常对您不可见。1.正确设置后,JWT承载者身份验证将为您验证令牌。它将通过使用检索到的签名密钥验证签名来实现这一点,然后它可能会检查其他属性,如指定的受众或其生存期。
1.您不应该需要手动验证令牌。这是身份验证方案的工作。您正在使用身份验证堆栈,因此您可以在应用中访问用户主体,而无需执行任何操作。
SaveTokens = true
中的令牌,您可以在HTTP上下文中使用GetTokenAsync
方法。1.您可以使用身份验证事件来添加身份验证方案的默认行为。但是,对于使用标准机制验证令牌,您不需要这样做。
1.只有一个中间件:身份验证中间件。它使用配置的身份验证方案来执行用户身份验证,以便在正确设置后,通过身份验证的用户在整个应用程序中可用,例如在控制器,MVC过滤器,Razor视图等中。
vlurs2pr2#
如果我定义了正确的JwtBearerOptions(就像我上面做的那样),这个.AddJwtBearer()中间件会为我验证ID令牌吗?或者我需要手动验证来自JWKs URI的JWKs的ID令牌吗?
AddJwtBearer仅用于API验证访问令牌并从中创建用户(ClaimsPrincipal)。它所做的就是这个。它不处理id令牌。
一般来说,将API放在一个单独的服务上更容易,以便更清楚地说明谁在做什么。当您将客户端和API混合在同一个服务中时,可能很难推理。
如果我必须使用JWKs URI中的JWKs手动验证ID令牌,那么当中间件向/.well-known/keys端点发出请求时,我如何存储这些JWKs?我如何获得与访问令牌和刷新令牌对应的cookie,然后将刷新令牌发送到我的授权服务器?
ID令牌由AddOpenIdConnect为您进行验证和处理。您不需要自己验证ID令牌。AddOpenIdConnect将创建cookie并选择将令牌存储在cookie中。
总的来说,这两个中间件为我处理了什么,我不需要手动做(即令牌验证和/或令牌更新)?
总结如下:
客户端使用.AddOpenIdConnect(),允许用户登录。
后端接口使用.AddJswtBearer()。
令牌更新是一个不同的故事,他们都没有开箱即用。为此,您可以考虑使用IdentityModel.AspNetCore或自己做一些事情。
为了补充这个答案,我写了一篇博客文章,更详细地讨论了这个主题:Debugging OpenID Connect claim problems in ASP.NET Core