如何在blazor Webassembly项目的服务器端控制器中对用户进行身份验证?

问题描述

我有一个使用Identityserver和Facebook身份验证的出色Webassembly项目。从Webassembly调用api控制器时,在使用.AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>()设置httpclient并将useridclaimtype映射到nameidentifier后,一切工作都很好。通过UserManager.GetUserAsync可以访问该用户。

现在,我尝试添加一个纯服务器控制器,其视图希望用户能够直接从浏览器进行浏览。但是,直接浏览到服务器视图时,尽管进行了设置,但似乎没有进行身份验证:

app.UseIdentityServer();
app.UseAuthentication();
app.UseAuthorization();

services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
.AddRoles<IdentityRole>()
.AddEntityFrameworkStores<ApplicationDbContext>();

services.AddIdentityServer()
.AddApiAuthorization<ApplicationUser,ApplicationDbContext>();

services.AddAuthentication()
.AddIdentityServerJwt().AddFacebook(facebookOptions =>
{
   facebookOptions.AppId = Configuration["id"];
   facebookOptions.AppSecret = Configuration["idpwd"];
});

services.Configure<IdentityOptions>(options => options.ClaimsIdentity.UserIdClaimType = ClaimTypes.NameIdentifier);

我曾期望中间件通过这种设置为我自动进行身份验证。但是,即使我先登录并携带.AspNetCore.Identity.Application cookie,该用户仍无法通过usermanager进行访问。我只会得到一个没有名称和声明的空白标识,并且如果向控制器添加Authorize属性,则会得到401。

我是否缺少一些秘诀才能使它正常工作?我对中间件应该为我做什么有错误的期望吗?

更新:

经过一番摸索,比较了一个可以正常工作的标准asp.net核心项目和我的项目。看来这是杀死服务器端控制器的行:

services.AddAuthentication().AddIdentityServerJwt()

如果我不添加AddIdentityServerJwt(),则控制器运行良好,并在需要授权时重定向我,并正确登录。谁能向我解释为什么? AddIdentityServerJwt()中间件与返回视图的Controller不兼容吗?

在我看来,添加AddIdentityServerJwt()增加了以下要求:每个请求都需要带有承载令牌的授权标头,这是由blazor客户端httpclient提供的。但是,当浏览器直接进行呼叫时,承载令牌将丢失,并且管道也不会尝试对用户进行身份验证以获取呼叫。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)