Blazor-B2C身份验证-在登录时保持用户数据的正确方法是什么



我正在构建一个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第一行上的断点进行测试。

相关内容

  • 没有找到相关文章

最新更新