首页 > 解决方案 > 实施自己的身份验证/身份服务

问题描述

所以我一直在阅读很多关于授权和身份验证的内容。现在我很困惑,因为我不确定什么是最好的和合适的工具。

让我给你一点背景。

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

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

我考虑过使用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在提供给用户并针对用户存储之前应该将哪种信息加密。

老实说,任何建议现在都会有所帮助,因为我已经被困了好几天了。如果您对应该做什么或使用什么工具有任何建议,请告诉我

标签: c#apisecurityasp.net-coremicroservices

解决方案


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

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

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

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

推荐阅读