【问题标题】:Change ASP.NET Core Web API's OAuth Authorization from Implicit to Auth-Code Grant将 ASP.NET Core Web API OAuth 授权从隐式更改为 Auth-Code 授权
【发布时间】:2021-04-27 10:29:23
【问题描述】:

环境:Azure、Azure AD 免费许可证;

我构建了一个 ASP.NET Core 3.0 Web API 并托管在 Azure 应用服务中。它设置为OAuth Implicit Grant flow,其中令牌在授权标头中用作bearer。到目前为止一切正常;从令牌生成到授权再到 Web API 的身份验证。

我已经设置为:

public void ConfigureServices(IServiceCollection services)
        {
            services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
                .AddAzureADBearer(options => {
                    var readAzureAdFromEnvironment = Environment.GetEnvironmentVariable("READ_AZUREAD_FROM_ENVIRONMENT");
                    if (!string.IsNullOrEmpty(readAzureAdFromEnvironment) && readAzureAdFromEnvironment.ToUpper().Equals("TRUE"))
                    {
                        var INSTANCE = Environment.GetEnvironmentVariable("INSTANCE");
                        var DOMAIN = Environment.GetEnvironmentVariable("DOMAIN");
                        var TENANTID = Environment.GetEnvironmentVariable("TENANTID");
                        var CLIENTID = Environment.GetEnvironmentVariable("CLIENTID");

                        options.Instance = INSTANCE;
                        options.Domain = DOMAIN;
                        options.ClientId = CLIENTID;
                        options.TenantId = TENANTID;
                    }
                    else
                    {
                        Configuration.Bind("AzureAd", options);
                    }
                });

            services.Configure<Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, options =>
            {
                options.Events = new Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerEvents
                {
                    OnTokenValidated = OnTokenValidated
                };

                options.RequireHttpsMetadata = false;

                options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters()
                {
                    ValidateIssuer = false,
                    ValidateAudience = false
                };
            });

            services.AddControllers()
                .AddFluentValidation(s =>
                {
                    s.RegisterValidatorsFromAssemblyContaining<Startup>();
                    s.RunDefaultMvcValidationAfterFluentValidationExecutes = false;
                });

            services.AddLogging(loggingBuilder =>
            {
                loggingBuilder.AddConsole();
                loggingBuilder.AddDebug();
                loggingBuilder.AddAzureWebAppDiagnostics();
            });

            services.AddApiVersioning(x =>
            {
                x.DefaultApiVersion = new ApiVersion(5, 0);
                x.AssumeDefaultVersionWhenUnspecified = true;
                x.ReportApiVersions = true;
                x.ApiVersionReader = new HeaderApiVersionReader("x-api-version");
            });
        }

我了解到 ASP.NET Core 的默认 OAuth 设置也是 Implicit Grant type.

但是,考虑到消费者需要整合的上下文 使用自动化流程,手动输入似乎不可行 凭证并在每次令牌过期时获取一个新令牌。

我也学到了这两者;隐式和 Auth-Code 需要 access_token 作为其最后阶段。

到目前为止我做了什么:

  1. 我能够通过使用带有client secretoauth2/v2.0/token 端点生成access_token,并在授权标头中使用bearer 的令牌并且它有效。但是,我注意到我无法获取登录的用户 ID。我使用了以下内容:

    client_id:“xxxxxxxxxxxxxxxxxxxxxxxx” grant_type:“client_credentials” client_secret:“xxxxxxxxxxxxxxx” 范围:“api://xxxxxxxxxxxxxx/.default”

做了一些研究,发现Authorization Code Grant flow 非常适合这种情况,因为它可以生成refresh token,并且可以在令牌过期而不提示用户凭据的情况下使用。

要从隐式更改为Auth-Code Grant 我该怎么办?我有几个问题希望有人可以帮助我

  1. 是否涉及 Azure Active Directory 中的代码更改或配置更改?
  2. 如何配置Refresh_Token?这是否涉及 Azure Active Directory 中的代码更改或配置更改?
  3. Azure AD Free licence 是否有任何限制

如果能给出示例代码,不胜感激。

资源: Bearer token: The signature is invalid - Default ASP.NET Core 2.1 Web Api template published to Azure

【问题讨论】:

    标签: c# asp.net-core oauth-2.0 azure-active-directory azure-web-app-service


    【解决方案1】:

    如果您正在调用令牌端点,则您没有使用隐式授权。 隐式从授权端点获取令牌。 那就是客户端凭据授予您正在使用的内容,为不涉及用户的应用程序请求令牌。

    您的 API 已配置为接受应有的访问令牌。

    您的前端应用程序可以使用隐式授权或授权码授权来获取调用 API 所需的访问令牌。 这些不涉及任何秘密,除非您使用来自后端 Web 应用程序的授权码授予。

    通常,前端 Javascript 应用程序会使用 MSAL.js 对用户进行身份验证并获取访问令牌。 这些访问令牌包括用户信息,与您通过客户端凭据授予获得的令牌不同。 MSAL.js 1.x 将使用隐式授权,2.x 将使用 PKCE 授权码授权。

    刷新令牌仅在这两个授权代码授予的情况下返回。 隐式授权确实使用隐藏的 iframe 进行刷新,并且取决于与 Azure AD 具有活动会话的用户。 您无需为此进行任何配置,这仅取决于您是否获得了使用的流程。

    Azure AD 免费版不会限制您使用这些身份验证流程。 没有付费许可证意味着您无法使用 Azure AD 中的某些功能,例如将组添加到应用中的角色的功能。

    如果您希望允许这两种类型的调用者访问它,您应该在后端考虑:使用没有用户的应用程序授予客户端凭据,以及使用包含用户的应用程序授予隐式/授权代码。 客户端凭据授予使用应用程序使用您必须检查的“应用程序权限”或“应用程序角色”,而其他应用程序使用您还需要检查的“委派权限”或“范围”。 除此之外,使用委派权限的应用程序始终涉及用户,因此您可能还需要授权用户访问所请求的资源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-21
      • 2018-11-19
      • 2023-03-12
      • 2020-09-25
      • 2020-05-18
      • 1970-01-01
      • 2015-05-17
      • 2017-06-15
      相关资源
      最近更新 更多