【发布时间】:2021-03-16 00:31:33
【问题描述】:
我的 ASP.NET Core 2.2 网站使用 OpenIdConnect 连接到外部 OIDC 提供程序以进行身份验证。所以我们会重定向到提供者,你登录,它会返回到站点。所有这些都是在服务器端处理的,效果很好。
我们的网站使用 javascript 与 API 后端通信,后端使用 [Authorize] 属性进行修饰。
现在,我们想与另一个应用程序共享我们的 API。我无法理解如何使其与现有的 OpenIdConnect 提供程序一起工作。如果我使用 Postman 拨打电话,我会添加一个 Bearer 令牌,但会返回我的 OIDC 提供商的登录屏幕。我明白了,它是为 OIDC 设置的。
我尝试使用 AddJwtBearer 并在我的控制器上设置了 [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)],当我这样做时,我可以成功传入一个 Bearer 令牌并从 Postman 调用我的 API,但我无法拨打电话来自我网站上的一个 javascript 页面。
所以最终的问题是,我如何配置这个站点,以便我可以使用 OIDC 从我的站点本身调用 API,也可以使用 Bearer 令牌从外部应用程序调用?
代码如下所示:
public void ConfigureServices(IServiceCollection services)
{
var authbuilder = services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
});
authbuilder.AddCookie(p =>
{
p.SlidingExpiration = true;
p.Events.OnSigningIn = (context) =>
{
context.CookieOptions.Expires = DateTimeOffset.UtcNow.AddHours(14);
return Task.CompletedTask;
};
});
authbuilder.AddOpenIdConnect(options =>
{
options.Authority = Configuration["OpenIdConnectSettings:AuthorityUrl"];
options.ClientSecret = Configuration["OpenIdConnectSettings:ClientSecret"];
options.ClientId = Configuration["OpenIdConnectSettings:ClientId"];
}
options.SaveTokens = true;
options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
options.GetClaimsFromUserInfoEndpoint = true;
options.Events = new OpenIdConnectEvents
{
OnTokenValidated = context =>
{
// validation logic omitted
}
编辑:任何外部应用程序也将使用相同的 OIDC 提供程序。这只是让我的 API 控制器从网站本身工作并从使用相同 OIDC 提供程序的另一个应用程序调用的问题。
编辑:我想我可能已经通过添加以下代码让它工作了:
services.AddAuthorization(options =>
{
var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(
JwtBearerDefaults.AuthenticationScheme, OpenIdConnectDefaults.AuthenticationScheme);
defaultAuthorizationPolicyBuilder = defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
});
【问题讨论】:
标签: asp.net-core authentication openid-connect