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,您可以轻松地确保您的应用程序受到保护,同时也提供了方便的身份验证和授权功能。