我们的基础架构如下:
我的理解是Identity Server 4的目的是执行以下两项操作之一:
单点登录。因此,您在SPA1上登录,仍然在SPA2和MVCApp1上登录。
授权第三方应用程序中的用户通过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
});
}
答案 0 :(得分:2)
我无法回答您的问题是否必要,因为这可能是基于观点的。但是我有一些话。
IdentityServer是OID2之上的OpenID Connect的实现。如果您不想使用OpenID Connect和OAuth2,则IdentityServer可能不是正确的工具。
但是,IdentityServer所做的不仅仅是实现规范。这也与职责分工有关。
有了中央权限,应用程序无需实现登录功能。在最简单的流程中,用户登录到IdentityServer,为用户提供一个令牌,并且客户端可以使用该令牌代表用户访问资源。所有资源所需要做的就是验证权限。
单一职责是一个好的设计,它将登录逻辑与业务逻辑(关注点分离)分开,并创建了一个更安全的环境。 SSO只是可以关闭的“副作用”。资源和客户端不应有权访问身份表。
但这也与保护您的资源有关。通过IdentityServer,使用最合适的流程很容易配置哪个客户端可以访问哪些资源。
IdentityServer负责身份验证和基本授权。身份验证是IdentityServer的职责。结果,所有用户都可以访问每个客户端/资源。授权实际上是资源的问题。这就是为什么他们提出PolicyServer的原因。
有了Asp.Net Core authorization,您将有很多选择来实现授权。
我无法告诉您该怎么做,我确信一切皆有可能。但是,当您看一下设计原则时,我宁愿分离关注点。
关于您的代码,七天的访问窗口非常大。尤其是在您无法撤消令牌的情况下。
关于用户链接错误页面的信息,您无法阻止一切。