【问题标题】:IdentityServer 4 Authentication Event in Client客户端中的 IdentityServer 4 身份验证事件
【发布时间】:2020-12-29 04:24:45
【问题描述】:

我将 IdentityServer 4 服务器设置为独立应用程序,使用 net core 3.1、针对 MySql 的 Entity Framework core 和 Net Core Identity 作为用户存储。另外,我有一个 Razor Pages 客户端应用程序,它针对身份服务器进行身份验证,用户登录发生在服务器上。这一切都很好。

我现在希望能够在客户端上为任何新用户身份验证或登录失败写入日志条目。我认为必须在某处引发事件。请问我该怎么办?

【问题讨论】:

  • 您有什么理由希望在客户端而不是身份验证服务器上登录?为此,在 IdentityServer 上提出了 events。无论如何,失败的登录都不会返回给客户端,因为它没有发生在那里,除非您捕获它并以某种方式将其发送给客户端。
  • 是的,主要用于审计目的。显然,人们可以并排阅读日志,但不太方便和有效。
  • 只是一些想法,您可以在 razor 客户端上添加一个端点,并将来自身份服务器的事件发布到 razor 客户端。或者,您可以向客户端添加一个中间件,该中间件检查附加到 ReturnUrl 或身份验证服务器引用者的某些参数的请求。
  • 我认为唯一可靠的是服务器到客户端的通信;将事件从一个发布到另一个。你不会从导航回来的人那里得到重复的事件。

标签: asp.net-core identityserver4 razor-pages asp.net-core-identity


【解决方案1】:

我有同样的要求,例如在审核日志中存储身份验证失败 - 如果有人尝试使用无效令牌访问 api。

我发现IdentityServerAuthenticationOptions 具有JwtBearerEvents 属性,可用于通知此类事件。

就我而言,它是这样工作的:

.AddAuthentication(AUTH_SCHEME).AddIdentityServerAuthentication(AUTH_SCHEME, options => {
    options.ApiName = config.ApiName;
    options.Authority = config.Address;
    options.JwtBearerEvents = new JwtBearerEvents
    {
        OnAuthenticationFailed = c =>
        {
            // Log can bo done here
            return Task.CompletedTask;
        },
        OnTokenValidated = c =>
        {
            // Log can bo done here
            return Task.CompletedTask;
        },
        OnChallenge = c =>
        {
            // Log can bo done here
            return Task.CompletedTask;
        },
        OnForbidden = c =>
        {
            // Log can bo done here
            return Task.CompletedTask;
        }
    };
    options.SupportedTokens = SupportedTokens.Jwt;});

我担心它会覆盖正常的 IS 行为,但一切似乎都像以前一样工作。

您可以在那里访问适当的上下文,例如在JwtBearerChallengeContext 中,您可以读取ErrorErrorDescription 字符串甚至整个HttpContext

【讨论】:

    猜你喜欢
    • 2017-03-07
    • 1970-01-01
    • 2016-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-23
    • 2023-04-10
    • 2021-04-22
    相关资源
    最近更新 更多