如何知道编辑的用户?
How to know the user edited?
我正在将 Blazor 服务器端与 ASP.NET Core 5 和 EF Core 5 一起使用。我希望在更新记录时自动生成 ModifiedBy
和 CreatedBy
.
我已经覆盖了 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 的责任,使用 AuthenticationStateProvider 或 AuthorizeView
组件。
@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);
}
}
我正在将 Blazor 服务器端与 ASP.NET Core 5 和 EF Core 5 一起使用。我希望在更新记录时自动生成 ModifiedBy
和 CreatedBy
.
我已经覆盖了 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 的责任,使用 AuthenticationStateProvider 或 AuthorizeView
组件。
@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);
}
}