C# 如何将IsActiveAsync故障信息传递给用户和客户端?

C# 如何将IsActiveAsync故障信息传递给用户和客户端?,c#,identityserver4,C#,Identityserver4,在我的IdentityServer4项目中,我实现了IProfileService。当使用隐式流和混合流时,在人类用户通过登录网页成功进行身份验证后,会多次调用IsActiveAsync方法 我注意到它是在上下文时调用的。Caller是以下值之一: AuthorizeEndpoint(附用户声明) 授权CodeValidation(带有用户声明) AccessTokenValidation(无用户声明) 由于一个错误,我的代码集context.IsActive=false——发生这种情况时,

在我的
IdentityServer4
项目中,我实现了
IProfileService
。当使用隐式流和混合流时,在人类用户通过登录网页成功进行身份验证后,会多次调用
IsActiveAsync
方法

我注意到它是在
上下文时调用的。Caller
是以下值之一:

  • AuthorizeEndpoint
    (附用户声明)
  • 授权CodeValidation
    (带有用户声明)
  • AccessTokenValidation
    (无用户声明)
由于一个错误,我的代码集
context.IsActive=false
——发生这种情况时,用于访问登录页面的web浏览器被重定向回登录页面,没有错误消息或原因信息。用户可能会感到困惑,为什么他们成功地进行了身份验证,但又提示再次登录。也没有添加新的querystring参数

IdentityServer4
日志会显示原因:

[23:16:40信息]
标识服务器4.响应处理.授权交互响应生成器
显示登录:用户未处于活动状态


现在,假设我的
IsActive=false
代码不是一个bug,但实际上是经过设计的(例如,因为用户的帐户在不同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);
}

这可能就是您所寻找的。

但是,如果在用户已成功通过
登录
操作的身份验证后,出现了一些情况,导致
IsActive
指示false,该怎么办?@Dai这是否回答了您的问题?或者答案中缺少了什么?谢谢你的检查:我现在已经切换到另一个项目,但我还没有真正抽出时间来解决这个问题,但我会回到那个项目上,尝试一下你的方法,看看效果如何,然后我才能将其标记为接受,但无论如何,我会投你一票:)
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);
        },
    }
}