c# - 实施自己的身份验证/身份服务
问题描述
所以我一直在阅读很多关于授权和身份验证的内容。现在我很困惑,因为我不确定什么是最好的和合适的工具。
让我给你一点背景。
我正在尝试创建一个包含 3 个服务的多租户应用程序,它们是:
- 租户服务(定义存在的租户并定义他们的范围,即允许他们使用哪些 API)
- 身份服务(为定义用户角色和用户所属租户的用户发放令牌)
- 应用服务(用于执行特定业务逻辑的 api 包)
我在创建身份服务时遇到的问题是:
- 某些 api 对不同租户的访问权限受到限制。这意味着不应允许属于仅有权调用 Product api 的租户的用户调用其他 api
- 某些 api 应该对不同的用户角色具有受限的访问权限。这意味着具有 admin 角色的用户可以发出任何 api 请求(前提是他们所属的租户也可以访问该 api),而具有不同角色的用户可能具有有限的 api 访问权限。
我考虑过使用Identity Server 4
,但我不喜欢不能为端点自定义自己的路由的想法。至少,如果我将来需要更改逻辑,创建我自己的服务将允许我进行这种定制。
到目前为止,我已经创建了使用以下代码请求访问令牌的能力:
[HttpPost]
public async Task<IActionResult> Token([FromHeader(Name = "client_id")] string tenantId, [FromBody] LoginRequest request)
{
var applicationUser = await _userManager.GetUserAsync(tenantId, request.email);
var result = await _signInManager.PasswordSignInAsync(applicationUser, request.password, true, false);
var claimsIdentity = new ClaimsIdentity(new Claim[]
{
new Claim("userId", applicationUser.Id),
new Claim("tenantId", tenantId),
new Claim("email", request.email)
});
// Add claims of the user from the data soruce
claimsIdentity.AddClaims(await _userManager.GetClaimsAsync(applicationUser));
var key = Encoding.ASCII.GetBytes("3ce1637ed40041cd94d4853d3e766c4d");
var token = new JwtSecurityToken(
claims: claimsIdentity.Claims,
expires: DateTime.Now.AddMinutes(1),
signingCredentials: new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
);
var jwtToken = new JwtSecurityTokenHandler().WriteToken(token);
return Ok(new LoginResponse { AccessToken = new AccessToken { Token = token, ExpiresIn = 200 }});
}
同样,因为我是授权和身份验证的新手,所以我不确定我的请求令牌调用是否应该要求grant_type
?
我不确定请求标头提供的tenantId 是否应该是client_secret
而且,我不确定refresh_token
在提供给用户并针对用户存储之前应该将哪种信息加密。
老实说,任何建议现在都会有所帮助,因为我已经被困了好几天了。如果您对应该做什么或使用什么工具有任何建议,请告诉我
解决方案
正如您所说,这是一个具有不同角色的多租户应用程序,我认为最好的选择是身份服务器 4。
您可以根据需要对其进行自定义,并且有很多在线帮助可以设置
编写自己的身份验证是个坏主意
- 需要很多时间
- 可能不安全
- 如果您遇到问题,您可能找不到支持
推荐阅读
- python - 通过数组内对象的两个值过滤 mongoengine/mongodb-query 中的项目
- amazon-s3 - 如何向 S3.upload() 请求添加“授权”标头?
- javascript - 如何仅对 JavaScript 中的前 3 个字符和最后一个字符进行分组(例如 123456789 => 123 45678 9)
- google-data-studio - 为什么在使用服务帐户访问底层 bigquery 数据时,社区连接器的“数据凭据”不能为空?
- python - 波函数 Python 上的曲柄 Nicolson 方法
- authentication - 需要帮助来修复此错误“对等方重置连接 - SSL_connect”
- javascript - 将视频上传预览附加到 div
- django - Django、静态文件和水平可扩展性
- ruby-on-rails - 来自多态模型的图像不显示
- javascript - 在函数调用jquery期间显示一个div