如果我们不需要 SSO 或 OAuth 2,是否还需要我们的 Identity Server?
Is our Identity Server necessary if we don't need SSO or OAuth 2?
我们的基础架构如下所示:
- IdentityServer4 认证服务器,
- .NET 核心 2.2 网络 api
- AngularSPA1
- AngularSPA2
- MVC MVCApp1
我的理解是 Identity Server 4 的目的是做以下两件事之一:
单点登录。所以你在 SPA1 上登录,你仍然在 SPA2 和 MVCApp1 上登录。
授权第 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 的访问量相当大。特别是如果您无法撤销令牌。
关于用户链接错误的页面,你无法阻止一切。
我们的基础架构如下所示:
- IdentityServer4 认证服务器,
- .NET 核心 2.2 网络 api
- AngularSPA1
- AngularSPA2
- MVC MVCApp1
我的理解是 Identity Server 4 的目的是做以下两件事之一:
单点登录。所以你在 SPA1 上登录,你仍然在 SPA2 和 MVCApp1 上登录。
授权第 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 的访问量相当大。特别是如果您无法撤销令牌。
关于用户链接错误的页面,你无法阻止一切。