在 .NET Core API 上使用 OpenID access_token
Using OpenID access_token on a .NET Core API
我有一个 angular 应用程序,它使用 OpenID 对用户进行身份验证,我可以在其中访问应该用于对其他服务进行身份验证的 access_token。
我目前正在使用 OAuth/OpenID
的验证码流程
我正在尝试使用 access_token 在 .NET Core Web API 上对用户进行身份验证。
无论我在此处进行何种设置组合,似乎都无法让我更接近解决方案。
Startup.cs
services.AddAuthentication(options =>
{
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.Authority = oauthOptions.Authority;
options.ClientId = oauthOptions.ClientId;
options.ClientSecret = oauthOptions.ClientSecret;
options.ResponseType = OpenIdConnectResponseType.Code;
options.UsePkce = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.SaveTokens = true;
oauthOptions.Scopes.ForEach(scope => options.Scope.Add(scope));
});
非常感谢guidance/link。
在这种情况下,您最可能需要的是 JWT Bearer Authentication 或 Token Introspection 库,它根据身份提供者验证访问令牌。
对于 JWT,这是通过 Microsoft.AspNetCore.Authentication.JwtBearer
NuGet 包提供的,可以像这样使用:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = "https://url.to.your/identity-provider";
options.Audience = /* your expected audience - e.g. guid or resource */;
});
通过这种方式,您可以在 SPA 应用程序中获取和更新 JWT Bearer 访问令牌,并将经过身份验证的请求发送到 API 后端(使用 Authorization: Bearer ...
headers)。
如果您的身份提供者使用引用令牌(即,它们不包含身份验证信息,而是需要用于从身份提供者获取身份验证信息),您将需要使用令牌内省。这是 - 例如 - 由 IdentityModel.AspNetCore.OAuth2Introspection
等第三方库提供
使用 IdentityModel.AspNetCore.OAuth2Introspection
的示例:
services.AddAuthentication(OAuth2IntrospectionDefaults.AuthenticationScheme)
.AddOAuth2Introspection(options =>
{
options.Authority = "https://url.to.your/identity-provider";
// Introspection requires client credentials to authenticate the requests
options.ClientId = "client_id_for_introspection_endpoint";
options.ClientSecret = "client_secret_for_introspection_endpoint";
});
我有一个 angular 应用程序,它使用 OpenID 对用户进行身份验证,我可以在其中访问应该用于对其他服务进行身份验证的 access_token。
我目前正在使用 OAuth/OpenID
的验证码流程我正在尝试使用 access_token 在 .NET Core Web API 上对用户进行身份验证。 无论我在此处进行何种设置组合,似乎都无法让我更接近解决方案。
Startup.cs
services.AddAuthentication(options =>
{
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.Authority = oauthOptions.Authority;
options.ClientId = oauthOptions.ClientId;
options.ClientSecret = oauthOptions.ClientSecret;
options.ResponseType = OpenIdConnectResponseType.Code;
options.UsePkce = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.SaveTokens = true;
oauthOptions.Scopes.ForEach(scope => options.Scope.Add(scope));
});
非常感谢guidance/link。
在这种情况下,您最可能需要的是 JWT Bearer Authentication 或 Token Introspection 库,它根据身份提供者验证访问令牌。
对于 JWT,这是通过 Microsoft.AspNetCore.Authentication.JwtBearer
NuGet 包提供的,可以像这样使用:
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = "https://url.to.your/identity-provider";
options.Audience = /* your expected audience - e.g. guid or resource */;
});
通过这种方式,您可以在 SPA 应用程序中获取和更新 JWT Bearer 访问令牌,并将经过身份验证的请求发送到 API 后端(使用 Authorization: Bearer ...
headers)。
如果您的身份提供者使用引用令牌(即,它们不包含身份验证信息,而是需要用于从身份提供者获取身份验证信息),您将需要使用令牌内省。这是 - 例如 - 由 IdentityModel.AspNetCore.OAuth2Introspection
等第三方库提供使用 IdentityModel.AspNetCore.OAuth2Introspection
的示例:
services.AddAuthentication(OAuth2IntrospectionDefaults.AuthenticationScheme)
.AddOAuth2Introspection(options =>
{
options.Authority = "https://url.to.your/identity-provider";
// Introspection requires client credentials to authenticate the requests
options.ClientId = "client_id_for_introspection_endpoint";
options.ClientSecret = "client_secret_for_introspection_endpoint";
});