如果我们不需要 SSO 或 OAuth 2,是否还需要我们的 Identity Server?

Is our Identity Server necessary if we don't need SSO or OAuth 2?

我们的基础架构如下所示:

我的理解是 Identity Server 4 的目的是做以下两件事之一:

  1. 单点登录。所以你在 SPA1 上登录,你仍然在 SPA2 和 MVCApp1 上登录。

  2. 授权第 3 方应用中的用户通过 OAuth 2.0 流程登录并将我们的数据授予第 3 方应用。

对于 #1,没有人应该每次都保持登录状态,因为 SPA1 和 SPA2 以及 MVCApp1 基本上都有不同的最终用户。也就是说,我们不需要 SSO。 对于 #2,不相关,因为我们永远不会允许这样做。

这意味着我们有一个 IdentityServer 4 项目,感觉有点矫枉过正,而且很难调试。诸如用户将 auth 服务器而不是应用程序添加为书签、重定向随机失败等等。

我的问题是,我可以直接切换到 API 中的用户身份验证并终止此 Identity Server 吗?我们可以轻松地在 API 中添加一个 Authenticate Endpoint。这有什么不安全的地方吗?

像这样:

    [AllowAnonymous]
    [HttpPost("authenticate")]
    public IActionResult Authenticate([FromBody]UserDto userDto)
    {
        var user = _userService.Authenticate(userDto.Username, userDto.Password);

        if (user == null)
            return Unauthorized();

        var tokenHandler = new JwtSecurityTokenHandler();
        var key = Encoding.ASCII.GetBytes(_appSettings.Secret);
        var tokenDescriptor = new SecurityTokenDescriptor
        {
            Subject = new ClaimsIdentity(new Claim[] 
            {
                new Claim(ClaimTypes.Name, user.Id.ToString())
            }),
            Expires = DateTime.UtcNow.AddDays(7),
            SigningCredentials = new SigningCredentials(new SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
        };
        var token = tokenHandler.CreateToken(tokenDescriptor);
        var tokenString = tokenHandler.WriteToken(token);

        // return basic user info (without password) and token to store client side
        return Ok(new {
            Id = user.Id,
            Username = user.Username,
            FirstName = user.FirstName,
            LastName = user.LastName,
            Token = tokenString
        });
    }

我无法回答你是否有必要的问题,因为这可能是基于意见的。但是我有一些意见。

IdentityServer 是基于 OAuth2 的 OpenID Connect 的实现。如果您不想使用 OpenID Connect 和 OAuth2,那么 IdentityServer 可能不是正确的工具。

但是,IdentityServer 所做的不仅仅是实现规范。这也是关于分离责任。

有了中央授权,应用程序就不需要实现登录功能了。在最简单的流程中,用户登录 IdentityServer 并为用户提供令牌,客户端可以使用该令牌代表用户访问资源。资源只需要验证权限即可。

单一职责是一个很好的设计,将登录逻辑与业务逻辑分开(关注点分离)并创建更安全的环境。 SSO 只是一个可以关闭的 'side effect'。资源和客户端不应访问标识表。

但这也与保护您的资源有关。使用 IdentityServer 可以很容易地配置哪个客户端可以使用最合适的流程访问什么资源。

IdentityServer 负责身份验证和基本授权。其中身份验证是 IdentityServer 的责任。因此,所有用户都可以访问每个 client/resource。授权实际上是资源的关注点。这就是为什么他们提出 PolicyServer.

有了 Asp.Net Core authorization,您将有很多选择来实施授权。

我无法告诉你该怎么做,但我相信一切皆有可能。但是当你看一下设计原则时,我更喜欢关注点分离。

关于您的代码,7 天 window 的访问量相当大。特别是如果您无法撤销令牌。

关于用户链接错误的页面,你无法阻止一切。