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

时间:2019-04-18 23:08:15

标签: oauth-2.0 single-sign-on identityserver4

我们的基础架构如下:

  • IdentityServer4身份验证服务器,
  • .NET Core 2.2 Web API
  • 角度SPA1
  • Angular SPA2
  • MVC MVCApp1

我的理解是Identity Server 4的目的是执行以下两项操作之一:

  1. 单点登录。因此,您在SPA1上登录,仍然在SPA2和MVCApp1上登录。

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

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

这意味着我们有一个IdentityServer 4项目,感觉像是过分使用并且很难调试。诸如用户将身份验证服务器(而不是应用程序)标记为书签,随机重定向失败等之类的事情。

我的问题是我可以直接切换到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
        });
    }

1 个答案:

答案 0 :(得分:2)

我无法回答您的问题是否必要,因为这可能是基于观点的。但是我有一些话。

IdentityServer是OID2之上的OpenID Connect的实现。如果您不想使用OpenID Connect和OAuth2,则IdentityServer可能不是正确的工具。

但是,IdentityServer所做的不仅仅是实现规范。这也与职责分工有关。

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

单一职责是一个好的设计,它将登录逻辑与业务逻辑(关注点分离)分开,并创建了一个更安全的环境。 SSO只是可以关闭的“副作用”。资源和客户端不应有权访问身份表。

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

IdentityServer负责身份验证和基本授权。身份验证是IdentityServer的职责。结果,所有用户都可以访问每个客户端/资源。授权实际上是资源的问题。这就是为什么他们提出PolicyServer的原因。

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

我无法告诉您该怎么做,我确信一切皆有可能。但是,当您看一下设计原则时,我宁愿分离关注点。

关于您的代码,七天的访问窗口非常大。尤其是在您无法撤消令牌的情况下。

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