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