Net Core 集成第三方SSO登录 - Okta

发布时间 2023-09-19 09:09:20作者: 初久的私房菜

这篇文章将向您展示如何将 Okta 集成到 .Net Core API 中以进行身份验证和授权。我们将使用 Okta 作为标识提供程序,并使用 JWT 令牌对 API 进行授权。

配置身份验证和授权

  services.AddAuthentication(options =>
      {
          options.DefaultAuthenticateScheme = setting.Issuer;
          options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
      })
      .AddJwtBearer(setting.Issuer, options =>
      {
          options.TokenValidationParameters = new TokenValidationParameters
          {
              ValidIssuer = setting.Issuer,
              ValidateIssuer = true,

              ValidAudience = setting.Audience,
              ValidateAudience = true,

              ValidateIssuerSigningKey = true,
              IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(setting.SecretKey))
          };
      })
      .AddOktaWebApi(new OktaWebApiOptions()
      {
          OktaDomain = appSettings.OktaDomain,
          AuthorizationServerId = appSettings.AuthorizationServerId,
          Audience = appSettings.Audience,

          JwtBearerEvents = new JwtBearerEvents()
          {
              OnTokenValidated = context =>
              {
                  var claims = new List<Claim>
                      {
                          new Claim("StaffId", xxx.Id.ToString()),
                          new Claim(ClaimTypes.NameIdentifier, xxx.Id.ToString()),
                          new Claim(ClaimTypes.Email, xxx.Email),
                          new Claim(ClaimTypes.Surname, $"{xxx.First_Name} {xxx.Last_Name}"),
                          new Claim(ClaimTypes.Name, xxx.Staff_Account.Username),
                          new Claim(ClaimTypes.Role, xxx.Staff_Account.Role.ToString()),
                      };
                  var identity = (ClaimsIdentity)context.Principal.Identity;
                  identity.RemoveClaim(identity.FindFirst(ClaimTypes.NameIdentifier));
                  identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, staffInfo.Id.ToString()));
                  context.Principal = new ClaimsPrincipal(identity);
                  context.Principal.AddIdentity(new ClaimsIdentity(claims));
                  return Task.CompletedTask;
              },
              OnChallenge = context =>
              {
                  if (context.HttpContext.Response.StatusCode == 401)
                  {
                      var allowedOrigins = appSettings.CorsWhiteUrlList.ToArray();
                      var requestOrigin = context.Request.Headers["Origin"].FirstOrDefault();
                      var responseOrigin = allowedOrigins.Contains(requestOrigin) ? requestOrigin : null;

                      context.Response.Headers.Add("Access-Control-Allow-Origin", responseOrigin);
                      context.Response.Headers.Add("Access-Control-Allow-Headers", "*");
                      context.HttpContext.Response.StatusCode = StatusCodes.Status401Unauthorized;
                      context.HttpContext.Response.ContentType = "application/json";
                      context.HttpContext.Response.WriteAsync("Account does not exist");
                  }

                  return Task.CompletedTask;
              }
          }

      });
  services.AddAuthorization(options =>
  {
      options.AddPolicy("DefaultPolicy", policy =>
      {
          policy.AuthenticationSchemes.Add("mapleplan.com.au");
          policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
          policy.RequireAuthenticatedUser();
      });
  });
 o.MapControllers().RequireAuthorization("DefaultPolicy");

这段代码做了以下几件事情:

向服务集合添加JWT身份验证和Okta Web API身份验证。
配置JWT令牌验证参数。
在 JWT 令牌验证成功后,调用 OnTokenValidated 委托方法,将用户信息添加到声明中。
在用户未经身份验证时,调用 OnChallenge 委托方法返回错误消息。
添加访问策略。
安全地保护API

结论

在本文中,我们已经了解了如何将 Okta 集成到 .Net Core API 中以进行身份验证和授权。我们使用 NuGet 包添加了必要的库,然后在 StartUp.cs 文件中配置了身份验证和授权。我们还演示了如何安全地保护 API,并通过添加 [Authorize] 属性来确保只有经过身份验证且具有访问权限的用户才能访问该API。通过将 Okta 集成到您的 .Net Core API,您可以轻松地确保您的应用程序受到保护,同时也提供了方便的身份验证和授权功能。