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

Okta是一个流行的身份认证服务,提供了一套完整的解决方案来管理用户身份,包括单点登录(SSO)、多因素认证(MFA)等。通过使用Okta,开发者可以轻松地在应用程序中实现安全的身份验证和授权机制。

配置身份验证和授权

  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集成时,确保不要在代码库中硬编码敏感信息,如客户端密钥或密钥。使用环境变量或安全的配置管理服务来存储这些信息。
  • 定期更新Okta SDK:为了利用最新的安全修复和功能更新,定期更新您的Okta SDK和相关依赖项。
  • 监控和日志记录:配置适当的监控和日志记录,以便于跟踪认证流程中的任何异常或错误,及时响应潜在的安全问题。
    结论

结论

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

posted @ 2023-09-19 08:37  初久的私房菜  阅读(16605)  评论(0编辑  收藏  举报
作者:初久的私房菜
好好学习,天天向上
返回顶部小火箭
好友榜:
如果愿意,把你的博客地址放这里
张弛:https://blog.zhangchi.fun/