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

我有一个使用identityserver和facebook身份验证的出色的webassembly项目。从Webassembly调用api控制器时,在使用设置httpclient.AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>()并将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()中间件是否与返回视图的控制器不兼容?

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

兰迪

发生了什么

控制器端点上AuthorizeFilter的特定混合以及身份验证构建器上AddIdentityServerJwt的用法可能是这里的罪魁祸首。AddIdentityServerJwt将Jwt身份验证方案添加为默认身份验证方案,该默认身份验证方案由AddAuthentication方法中传递身份验证方案名称指示。这意味着与此Jwt身份验证方案(JwtBearerHandler关联的处理程序将是通过其HandleChallengeAsync方法发出401的类请注意,此方法没有用于进一步操作的重定向,这就是为什么看不到重定向的原因。

为什么会这样呢?

由于控制器端点上的AuthorizeFilter,因此调用了JwtBearerHandler上的HandleChallengeAsync方法。执行AuthorizeFilter的方法OnAuthorizationAsync方法(在初始化过滤器后立即调用)。由于没有在控制器上的Authorization属性中指定任何策略(在中没有传递任何参数作为参数[Authorize]),因此最终使用了默认授权策略。默认策略基本上检查是否有任何身份验证方案已经成功验证了您的身份(通过查看HttpContext中的身份),如果没有,则返回质询响应此挑战默认为默认身份验证方案的挑战,这就是为什么在JwtBearerHandler上调用HandleChallengeAsync的原因。

您可以在此处了解有关策略的更多信息,并在此处了解有关AuthorizationFilter(以及一般的过滤器)的更多信息

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Google reCAPTCHA:如何在服务器端获得用户响应并进行验证

如何在服务器端Blazor中访问HttpContext?

如何使用离子云Auth检查经过身份验证的状态服务器端

如何在节点JS的服务器端验证Google身份验证令牌?

如何在laravel 5.4中进行服务器端api验证

如何使用Firebase身份验证在服务器端检索刷新令牌?

Firebase对用户进行身份验证后,如何从服务器端重定向浏览器

Laravel如何在apiResources控制器中获取身份验证用户详细信息

如何在服务器端Blazor中通过HttpContext登出

服务器端Blazor获得身份验证到期

如何在Blazor WebAssembly中实现OIDC身份验证?

如何在服务器端Blazor中自定义ASP.NET Core身份?

如何在blazor服务器端本地化验证消息(DataAnnotationsValidator)

如何在Blazor服务器端的CircuitHandler中调用方法?

如何在没有Microsoft身份的情况下进行JWT身份验证blazor服务器?

如何使用Blazor服务器对用户进行身份验证

进行身份验证时如何在码头服务器中获取客户端证书

在为托管的Blazor WebAssembly应用程序提供服务之前,如何使用Azure AD B2C对服务器上的用户进行身份验证?

服务器端Blazor中的OIDC身份验证

如何在服务器端的Excel中实现“组织帐户”身份验证?

用户登录后,如何在Blazor服务器端应用程序中检索用户声明?

如何验证Google身份服务器端

使用表单身份验证时如何在服务器端获取当前用户域?

如何在春季集成中设置TLS服务器以对客户端进行身份验证?

如何在Git for Windows客户端中对我们的TFS服务器进行身份验证?

如何在 Blazor 服务器端呈现 Javascript?

如何在 Blazor 服务器端更新多个用户?

如何在 blazor 服务器端应用程序中扩展身份验证过程?

Blazor 服务器端 => 没有身份脚手架的身份验证可能吗?