- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 IdentityServer4
项目中,我实现了 IProfileService
。 IsActiveAsync
方法在使用隐式和混合流时在人类用户通过登录网页成功进行身份验证后被调用多次。
我注意到它在 context.Caller
是这些值之一时被调用:
AuthorizeEndpoint
(带有用户声明)AuthorizationCodeValidation
(带有用户声明)AccessTokenValidation
(没有用户声明)由于错误,我的代码设置了 context.IsActive = false
- 当发生这种情况时,用于访问登录页面的网络浏览器被重定向回登录页面没有错误信息或原因信息。用户会感到困惑,为什么他们已成功验证但提示再次登录。也没有添加新的查询字符串参数。
IdentityServer4
日志确实显示了原因:
[23:16:40 Information]
IdentityServer4.ResponseHandling.AuthorizeInteractionResponseGenerator
Showing login: User is not active
现在,假设我的 IsActive = false
代码不是错误,而实际上是设计使然(因为,例如,用户的帐户确实在不同 OAuth/OpenIDConnect 之间的微秒内被禁用HTTP 请求),在这种情况下,我如何确保将此消息呈现给用户和/或客户端软件?
最佳答案
经过一些调查,我决定更新答案。
首先,context.IsActive
用于表示是否GetProfileDataAsync
应该执行。
“问题”是客户端开始多次调用 ProfileService 来检索信息。这些单独的调用由客户端发起,并在用户登录后进行。
对于直接响应,您可以将代码添加到登录方法。当用户不活动时,您可以使用错误消息进行响应。我认为这是最好的检查位置,因为它会阻止很多操作。
以下片段摘自 IdentityServer 的示例之一。它处理登录请求。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginInputModel model, string button)
{
if (ModelState.IsValid)
{
var result = await _signInManager.PasswordSignInAsync(model.Username, model.Password, model.RememberLogin, lockoutOnFailure: true);
if (result.Succeeded)
{
var user = await _userManager.FindByNameAsync(model.Username);
// Assume user has property IsActive for this example.
// You can implement this anyway you like.
if (user.IsActive)
{
...
}
}
ModelState.AddModelError("", AccountOptions.InvalidCredentialsErrorMessage);
}
// something went wrong, show form with error
var vm = await BuildLoginViewModelAsync(model);
return View(vm);
}
您可以使用 ModelState.AddModelError
添加任何您喜欢的消息.
现在假设用户确实登录并稍后被停用,那么 ProfileService 将不会返回声明。相反,它会导致 401:用户未激活。
客户端随后会抛出异常,因为请求必须成功:HttpResponseMessage.EnsureSuccessStatusCode
.
幸运的是,有一个选项可以处理异常。那就是实现oidc事件。这只是一个简单的例子:
services.AddOpenIdConnect("oidc", "Open Id connect", options =>
{
options.Events = new OpenIdConnectEvents()
{
// When a user is not active this will result in a 401
OnAuthenticationFailed = (context) =>
{
// Clear the exception, otherwise it is re-thrown after this event.
context.HandleResponse();
// Handle the exception, e.g. redirect to an error page.
context.Response.Redirect($"LoginError/?message={context.Exception.Message}");
return Task.FromResult(0);
},
}
}
这可能是您正在寻找的。
关于c# - 如何将 IsActiveAsync 失败信息传递给用户和客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52125486/
在我的 IdentityServer4 项目中,我实现了 IProfileService。 IsActiveAsync 方法在使用隐式和混合流时在人类用户通过登录网页成功进行身份验证后被调用多次。 我
我正在实现 user service即将用户信息存储在 Azure 表存储中。我想使用租户 ID 的值作为分区键的一部分,但是 GetProfileDataAsync 和 IsActiveAsync
我是一名优秀的程序员,十分优秀!