【问题标题】:Using OpenIdConnect and JwtBearer authentication together一起使用 OpenIdConnect 和 JwtBearer 身份验证
【发布时间】: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


    【解决方案1】:

    如果另一个应用程序是服务/应用程序(不是面向人类的客户端),则该应用程序需要在您的 OIDC 提供程序中注册为客户端,然后最好使用客户端凭据流,从您的 OIDC 提供程序获取令牌并将其传递给 API。

    API 仅信任来自您的 OIDC 提供商(令牌颁发者)的访问令牌,因此应用程序需要针对应用进行身份验证并获取正确的访问令牌。

    【讨论】:

      猜你喜欢
      • 2016-09-20
      • 2018-02-04
      • 1970-01-01
      • 2022-08-18
      • 1970-01-01
      • 2019-11-23
      • 2019-01-27
      • 2018-02-24
      • 2020-09-23
      相关资源
      最近更新 更多