问题描述
我有一个使用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 (将#修改为@)