如何知道编辑的用户?

How to know the user edited?

我正在将 Blazor 服务器端与 ASP.NET Core 5 和 EF Core 5 一起使用。我希望在更新记录时自动生成 ModifiedByCreatedBy .

我已经覆盖了 SaveChangeAsync 如下:

public override Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
{
    ApplyInterfaces();
    return base.SaveChangesAsync(cancellationToken);
}

private void ApplyInterfaces()
{
    var userId = _httpContextAccessor?.HttpContext?.User?.Identity?.Name;
    var currentUsername = !string.IsNullOrEmpty(userId)? userId: "Anonymous";

    foreach (ICreatedBy entity in ChangeTracker.Entries().Where(x => x.Entity is ICreatedBy).Where(x => x.State == EntityState.Added).Select(x=> x.Entity))
    {
        entity.CreatedBy = currentUsername;
        entity.CreatedDate = DateTime.Now;
    }

    foreach (IModifiedBy entity  in  ChangeTracker.Entries().Where(x=> x.State == EntityState.Modified).Where(x => x.Entity is IModifiedBy).Select(x => x.Entity))
    {
        entity.ModifiedBy = currentUsername;
        entity.ModifiedDate = DateTime.Now;
    }
}

_httpContextAccessor被注入到DBContext。我添加了服务

    services.AddHttpContextAccessor();

在 IIS Express 上一切正常。但是当我发布到 IIS 时 _httpContextAccessor.HttpContext 是空的。

我哪里遗漏了什么?

您不应在 Blazor 应用程序 (source) 中使用 IHttpContextAccessor

从您的代码示例中不清楚这段代码是在 Blazor component/page 中还是在数据库访问库中。如果它在数据库层,您应该修改 SaveChangesAsync 以添加一个 string username 参数,然后您可以将其传递给 ApplyInterfaces.

获取用户应该是 Blazor page/component 的责任,使用 AuthenticationStateProviderAuthorizeView 组件。

@page "/example"
@inject AuthenticationStateProvider auth;

<button @OnClick="Save">Save</button>

@code 
{
   async Task Save()
   {
      var state = await auth.GetAuthenticationStateAsync();
      var username = state.User.Identity?.Name ?? "[anon]";
      await someObject.SaveChangesAsync(username);
   }
}