Blazor WASM+;IdentityServer4+;自定义用户存储

Blazor WASM+;IdentityServer4+;自定义用户存储,identityserver4,asp.net-core-3.1,.net-core-3.1,blazor-client-side,Identityserver4,Asp.net Core 3.1,.net Core 3.1,Blazor Client Side,我正在Blazor WASM client/API后端的一个项目中工作,其中IdentityServer4用于身份验证,Dapper用于访问自定义用户存储的数据。大部分代码是直接从下面的文章中窃取的 我已经为User、Role、UserStore、RoleStore和SignInManager实现了自己的类,并在IdentityServer4 Quickstart项目的启动中注册了它们,如下所示: services.AddIdentity<CustomUser, CustomRole&g

我正在Blazor WASM client/API后端的一个项目中工作,其中IdentityServer4用于身份验证,Dapper用于访问自定义用户存储的数据。大部分代码是直接从下面的文章中窃取的

我已经为User、Role、UserStore、RoleStore和SignInManager实现了自己的类,并在IdentityServer4 Quickstart项目的启动中注册了它们,如下所示:

services.AddIdentity<CustomUser, CustomRole>()
.AddDefaultTokenProviders()
.AddSignInManager<CustomSignInManager>();
var builder = services.AddIdentityServer(options =>
{
    options.Events.RaiseErrorEvents = true;
    options.Events.RaiseInformationEvents = true;
    options.Events.RaiseFailureEvents = true;
    options.Events.RaiseSuccessEvents = true;
})
.AddInMemoryIdentityResources(Config.Ids)
.AddInMemoryApiResources(Config.Apis)
.AddInMemoryClients(Config.Clients)
.AddAspNetIdentity<CustomUser>(); //Added recently
从登录帖子的IdentityServer4帐户控制器快速启动:

  var result = await _signInManager.PasswordSignInAsync(model.Username, 
              model.Password, model.RememberLogin, lockoutOnFailure: true);
  if (result.Succeeded)
  {
      var user = await _userManager.FindByNameAsync(model.Username);
      if (context != null)
      {
          if (await _clientStore.IsPkceClientAsync(context.ClientId))
              return this.LoadingPage("Redirect", model.ReturnUrl);
上面的代码正确地使用了我的SignInManager,我成功地进行了密码检查。_userManager.FindByNameAsync正确查找并填充用户,但当它到达“returnthis.LoadingPage”部分时。。。它永远不会回到Blazor客户端应用程序。ID4登录页面刚刚刷新

我发现另一个人在没有重新路由方面也有类似的问题,并且发现他们在返回之前添加了以下代码以重定向到他们的。我试过了,效果很好

if (await _clientStore.IsPkceClientAsync(context.ClientId))
{
 Claim[] claims = new Claim[] { new Claim("test", "test") };
 await HttpContext.SignInAsync(user.Id.ToString(), user.UserName, claims);
 return this.LoadingPage("Redirect", model.ReturnUrl);
}

我的问题是。。。为什么在使用自定义SignInManager时需要HttpContext.SignInAsync,而在使用默认实现时则不需要?这段代码应该放在哪里?

您是否在使用chrome并在本地提供identity server而不使用TLS?我不知道浏览器会如何影响ReturnURL字符串和处理,但是的,我正在使用chrome,它现在正在本地主机上运行,因为我认为chrome拒绝了您的cookie,所以即使是您的后端代码也可以工作,如果chrome没有保存cookie并将其与随后的每个请求一起发送,则您不会被登录。这就是您再次看到登录页面的原因。看这里,但这只是一个猜测。我刚刚检查了一下,所有的东西都是在HTTPS上运行的,所以根据我阅读链接文章的方式,这会使它看起来好像不管浏览器是什么,它都应该工作。话虽如此,我在Edge中尝试了相同的测试,但仍然没有达到预期效果。此外,我有一个不同的项目,它没有定制的用户存储,工作正常。因此,我将重申我的断言,这是一个与代码/设置相关的问题。有效的是基于Ok,我找到了部分答案,但仍然有一个问题。编辑初始问题。
if (await _clientStore.IsPkceClientAsync(context.ClientId))
{
 Claim[] claims = new Claim[] { new Claim("test", "test") };
 await HttpContext.SignInAsync(user.Id.ToString(), user.UserName, claims);
 return this.LoadingPage("Redirect", model.ReturnUrl);
}