【发布时间】:2020-12-19 01:12:12
【问题描述】:
我有一个使用身份服务器和 facebook 身份验证的 blazor 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,用户仍然无法通过用户管理器访问。我只得到一个没有名称和声明的空白身份,如果我向控制器添加 Authorize 属性,我会得到 401。
我是否遗漏了一些秘密成分来使其发挥作用?我对中间件应该为我做什么有错误的期望吗?
更新:
在玩了一会儿并比较了一个标准的 asp.net 核心项目和我的项目之后。似乎这是杀死服务器端控制器的行:
services.AddAuthentication().AddIdentityServerJwt()
如果我不添加AddIdentityServerJwt(),控制器会表现良好并在我需要授权时重定向我,并正确登录。谁能向我解释这是为什么? AddIdentityServerJwt() 中间件是否与返回视图的控制器不兼容?
在我看来,添加 AddIdentityServerJwt() 添加了要求,即 blazor 客户端 httpclient 提供的每个请求都需要带有不记名令牌的授权标头。但是当浏览器直接进行调用时,不记名令牌丢失,并且管道也不会尝试对用户进行身份验证以获取一个。
【问题讨论】:
标签: asp.net-core authentication asp.net-identity identityserver4 blazor