【发布时间】:2021-10-28 04:42:24
【问题描述】:
以下是一些有助于理解问题的工件:
- 示例代码 - Github repo
- 已部署的应用程序 - 不再可用
更新:我关注了这个 YouTube 视频,我现在认为它是正确在 Blazor 服务器应用程序的依赖服务中访问有关经过身份验证的用户信息的方法: https://www.youtube.com/watch?v=Eh4xPgP5PsM.
我已更新 Github 代码以反映该解决方案。
我在我的 ASP.NET MVC Core 应用程序中使用依赖注入注册了以下类。
public class UserContext
{
ClaimsPrincipal _principal;
public UserContext(ClaimsPrincipal principal) => _principal = principal;
public bool IsAuthenticated => _principal.Identity.IsAuthenticated;
}
public class WrapperService
{
UserContext _userContext;
public WrapperService(UserContext context) => _userContext = context;
public bool UserHasSpecialAccess()
{
return _userContext.IsAuthenticated;
}
}
IoC 依赖注册在 Startup.cs 中配置
services.AddScoped<ClaimsPrincipal>(x =>
{
var context = x.GetRequiredService<IHttpContextAccessor>();
return context.HttpContext.User;
});
services.AddScoped<UserContext>();
services.AddScoped<WrapperService>();
我最近在 MVC 应用程序中启用了 Blazor,并希望在我的 Blazor 组件中使用我的 DI 注册服务。
我将服务注入到 Blazor 组件中以便像这样使用它:
@inject WrapperService _Wrapper
但是,当我尝试从服务器端处理程序使用服务时,请求失败并出现异常,抱怨无法构造服务 - 由于 IHttpContext 在对服务器的后续调用中不存在。
<button @onclick="HandleClick">Check Access</button>
async Task HandleClick()
{
var hasPermission = _Wrapper.UserHasSpecialAccess(); // fails ????
}
我想我理解为什么在 Blazor Server 应用程序中使用 IHttpContextAccessor 不起作用/不推荐使用。我的问题是,如果没有它,我如何访问我的服务中需要的声明?
对我来说奇怪的是,当我在开发环境中的 IIS Express 下运行它时,这一切正常,但当我部署并尝试从 Azure AppService 中运行它时却失败了。
【问题讨论】:
-
您正在使用服务器端 Blazor,在这种情况下您可以访问 httpcontext。您的服务应该使用 HttpContext,然后从上下文中访问 Claims。 UserContext(IHttpContextAccessor ...) 你的 github 链接也显示 404。
-
如果某些页面没有用户登录,我会创建一个临时用户并使用中间件登录。您可能有兴趣查看我的 Invoke 方法的信号:
public async Task Invoke (HttpContext context, UserManager<IdentityUser> _userManager, SignInManager<IdentityUser> _signInManager)所有这些东西都会自动注入到方法中。 -
感谢@AliK,repo 是私有的。我已经更改了可见性,现在它是公开的????
-
嗨@Bennyboy1973,根据这篇文章,Razor 组件不支持 SignInManager 和 UserManager。 docs.microsoft.com/en-us/aspnet/core/blazor/security/… 我还注意到 HttpContext(通过 IHttpContextAccessor)并不总是可用 - 因此我的 Azure 托管示例存在问题
-
你有没有设法解决这个问题?我也有一个与您的想法类似的服务项目,我在其中注入 ClaimsPrincipal 以获取登录用户,但在 blazor 中找不到我的方式。我不想注入 authenticationStateProvider 因为服务项目应该独立于 UI。
标签: c# blazor blazor-server-side