gpt4 book ai didi

c# - 使用 ASP.net Core Identity MVC 登录用户的登录 IP

转载 作者:行者123 更新时间:2023-11-30 12:54:26 24 4
gpt4 key购买 nike

我想要实现的目标:

将点击特定操作/ Controller 的用户的 IP 保存到我的数据库中。此外,由于此过程需要大量时间,因此最好在后台线程或类似线程上执行。

到目前为止我尝试了什么:

创建一个看起来像这样的 CustomAuthorizeAttribute:

    public class LoggedAuthorizeAttribute : TypeFilterAttribute
{
public LoggedAuthorizeAttribute() : base(typeof(LoggedAuthorizeFilter))
{
}
}

public class LoggedAuthorizeFilter : IAuthorizationFilter
{
private readonly UserManager<User> _userManager;

public LoggedAuthorizeFilter(UserManager<User> userManager)
{
_userManager = userManager;
}

public async void OnAuthorization(AuthorizationFilterContext context)
{
if (!context.HttpContext.User.Identity.IsAuthenticated)
return;

var user = await _userManager.GetUserAsync(context.HttpContext.User);

var remoteIpAddress = context.HttpContext.Connection.RemoteIpAddress;

user.UserLogins.Add(new UserLogin
{LoggedInOn = DateTimeOffset.UtcNow, LoggedInFrom = remoteIpAddress});

await _userManager.UpdateAsync(user);
}
}

此解决方案的问题:

  1. 当请求遇到标有此属性的操作时,请求将花费大约 1-2 秒,直到它实际处理该操作。
  2. UserManager 是通过依赖注入(inject)检索的,但我还在我的一些 Action 中访问了 UserManager 实例,这导致 InvalidOperationException 告诉 在上一个操作完成之前在此上下文中开始了第二个操作.这通常是由不同的线程使用相同的 DbContext 实例引起的,但是不保证实例成员是线程安全的。这也可能是由在客户端上评估嵌套查询引起的,如果是这种情况,请重写查询以避免嵌套调用。

感谢任何形式的帮助。

更新

正如 Kirk Larkin 所建议的那样,实现 IAsyncActionFilter 反而解决了我遇到的第二个问题。但是,即使这是正确的选择,我仍将如何在后台线程或类似线程中执行此操作。

最佳答案

因此,我使用 ConcurrentQueue 解决了我的第一个问题,它在后台线程上将其项目出队。我在 this 中找到了这个解决方案博客文章。它只需要稍作修改即可解决此问题。

关于c# - 使用 ASP.net Core Identity MVC 登录用户的登录 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56431147/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com