实施自己的身份验证/身份服务

时间:2019-08-15 18:13:55

标签: c# api security asp.net-core microservices

所以我已经阅读了很多有关授权和身份验证的内容。.由于我不确定使用哪种工具最合适,所以现在我感到困惑。

让我给你一点背景。

我正在尝试创建一个包含3个服务的多租户应用程序,这些服务是:

  • 租户服务(定义存在的租户并定义其范围,即允许他们使用的api)
  • 身份服务(为用户发出令牌,以定义用户的角色和用户所属的租户)
  • 应用程序服务(用于执行特定业务逻辑的一堆api)

我在创建身份服务时遇到的问题是:

  • 某些api对不同租户的访问权限受到限制。这意味着不应该允许租户的用户仅有权对Product 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

老实说,由于我被困了好几天,任何建议现在都将是有帮助的。如果您对应该做什么或使用什么工具有任何建议,请告诉我

1 个答案:

答案 0 :(得分:0)

正如您所说的是一个具有不同角色的多租户应用程序,我认为最好的选择是身份服务器4。

您可以根据需要对其进行自定义,并且有很多在线帮助可用于设置

编写自己的身份验证是一个坏主意

  1. 花很多时间
  2. 可能不安全
  3. 如果遇到问题,可能找不到支持