ASP Core 拦截所有身份验证请求

4

编辑 我正在寻找一种通用的方法来拦截身份验证请求,应该有一种方式可以全局配置此功能,使用中间件或事件等,与我正在使用的框架(IdentityServer4)无关。

我正在使用IdentityServer4对我的WebApi进行身份验证。 我正在寻找在身份验证之前和之后拦截身份验证请求的事件。

我的启动类以以下方式进行配置以处理身份验证。

app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
{
    Authority = "http://localhost:5000",
    RequireHttpsMetadata = false,

    ApiName = "api1"
});

我正在寻找一个后认证事件,以便我可以从IdentityServer4用户创建链接到本地用户,因此我可以在那里引用外键。是否有一个事件或一种简单的方法可以插入Post_Authentication_Requests和认证请求,我想对失败的登录尝试进行一些额外的日志记录?
1个回答

3

是的,大多数身份验证中间件都有一种方法可以连接到其各自的身份验证事件。这些可以在此处找到。回答你的问题,有几个PRE和POST身份验证事件钩子,您需要选择一个满足您需求的。例如:

app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions
{
    Authority = "http://localhost:5000",
    RequireHttpsMetadata = false,

    ApiName = "api1",

    Events = new OpenIdConnectEvents() 
    {
        OnMessageReceived = async context =>
        {
            //example of a "before" event hook
        }

        OnTokenValidated = async context =>
        {
            //example of an "after" event hook
            var claimsIdentity = context.Ticket.Principal.Identity as ClaimsIdentity;
            if (claimsIdentity != null)
            {
                // Get the user's ID
                string userId = claimsIdentity.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier).Value;
            }
        }
     }
});

您可以在 aspnet/Security 的样本库中查看一个示例,此处演示了如何劫持失败的身份验证请求以返回500(而不是正常的401)。请注意保留HTML标签。

我正在尝试做两件事情,如果用户是第一次从IdentityServer4登录,则将新用户添加到我的数据库中,那么我应该使用OnTokenValidated吗?另外,我想记录尝试登录的IP地址,这应该是在OnMessageReceived事件中完成吗?还是有更好的地方可以实现? - johnny 5
我已经实现了OnMessageReceived事件来更改类似以下的内容: x.Events = new OpenIdConnectEvents() { OnMessageReceived = c => { if (c.HttpContext.WebSockets.IsWebSocketRequest && c.Request.Query.ContainsKey("Authentication")) c.Token = c.Request.Query["Authentication"]; return Task.CompletedTask; } }; 但是当我调试时,它从未进入函数调用。 - Harris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接