我正在构建一个Blazor应用程序,看看如何在B2C AD登录后持久保存用户数据。
当用户登录应用程序时,我想将索赔数据持久化到sql数据库(ef 6核心(。
我正在尝试为用户捕获一个租户,以便在应用程序上进行筛选。
我认为定制中间件是一个很好的方法吗?
这是Blazor服务器端应用
我有这样的东西要测试。
public class PersistUserChangesMiddleware
{
private readonly RequestDelegate _next;
public PersistUserChangesMiddleware(RequestDelegate next)
{
_next = next;
}
[Authorize]
public Task Invoke(HttpContext httpContext, MyContext context)
{
try
{
var user = httpContext.User;
var claims = user.Claims;
var tenant = claims?.FirstOrDefault(c => c.Type.Equals("extension_CompanyId", StringComparison.OrdinalIgnoreCase));
if(tenant != null)
{
context.Tenants.Add(new Models.Tenant()
{
TenantName = tenant.Value
});
context.SaveChanges();
}
}
catch (Exception)
{
throw;
}
return _next(httpContext);
}
}
}
我不会让用户从中间件中的这个调用中返回。我需要为Blazor换一种方式吗?我设置了[授权],但仍然没有用户。
我看不出配置了哪个AuthenticationStateProvider
,但很可能是ServerAuthenticationStateProvider
。
创建一个自定义AuthenticationStateProvider
,它本质上是一个传递提供程序,只获取ClaimsPrincipal
用户并对其执行任何您想要的操作。(如果您使用的是其他提供程序,请告诉我(。
public class MyAuthenticationStateProvider : ServerAuthenticationStateProvider
{
public override async Task<AuthenticationState> GetAuthenticationStateAsync()
{
var authstate = await base.GetAuthenticationStateAsync();
if (authstate.User is not null)
{
ClaimsPrincipal user = authstate.User;
// do stuff with the ClaimsPrincipal
}
return authstate;
}
}
然后在Program
:中注册
builder.Services.AddRazorPages();
builder.Services.AddServerSideBlazor();
// sequence is crucial - Must be after AddServerSideBlazor
builder.Services.AddScoped<AuthenticationStateProvider, MyAuthenticationStateProvider>();
builder.Services.AddSingleton<WeatherForecastService>();
用GetAuthenticationStateAsync
第一行上的断点进行测试。