我有一个带有身份验证的blazor服务器应用程序(单用户帐户)。计划是保留处理所有身份验证内容的默认EF数据库,并拥有一个单独的SQL数据库,其中包含应用程序数据,我通过自己的数据访问层访问这些数据。
EF数据库将电子邮件地址存储到用户名,并在用户登录时将其显示为"Hello,abc@xyz.com“。由于我将用户的姓名存储在我的应用程序数据库中,所以我希望更改文本以显示名称:“你好,abc!”
出于某种原因,我们在一个blazor项目中:
在Shared/LoginDisplay.Lazor文件中,我设法以如下方式显示了名字(IUserData来自于我的数据访问库):
@inject UserManager<IdentityUser> _userManager
@inject AuthenticationStateProvider _authenticationStateProvider
@inject IUserData _userData;
<AuthorizeView>
<Authorized>
<a href="Identity/Account/Manage">Hello, @displayUserName</a>
<form method="post" action="Identity/Account/LogOut">
<button type="submit" class="nav-link btn btn-link">Log out</button>
</form>
</Authorized>
<NotAuthorized>
<a href="Identity/Account/Register">Register</a>
<a href="Identity/Account/Login">Log in</a>
</NotAuthorized>
</AuthorizeView>
@code {
private string displayUserName;
protected override async Task OnInitializedAsync()
{
displayUserName = "";
var user = (await _authenticationStateProvider.GetAuthenticationStateAsync()).User;
if (user.Identity.IsAuthenticated)
{
string userID = _userManager.GetUserId(user);
displayUserName = (await _userData.GetUserByID(userID)).FirstName;
}
}
}但是这两个.cshtml使用了不同的方法:
Pages/Shared/_LoginPartial
@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
<li class="nav-item">
<a id="manage" class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">Hello @UserManager.GetUserName(User)!</a>
</li>
...
}
...
</ul>Areas/Identity/Pages/Shared/_LoginPartial.cshtml
@using Microsoft.AspNetCore.Identity
@inject SignInManager<IdentityUser> SignInManager
@inject UserManager<IdentityUser> UserManager
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">Hello @User.Identity.Name!</a>
</li>
..
}
..
</ul>User是从哪里来的?(在某个地方应该有一个模型,对吗?)为什么首先有三个不同的LoginPartial文件(这只是页面的顶部,显示登录和注销按钮,实际登录页面在另一个文件中)?如何执行与.razor页面相同的(异步)方法?
发布于 2022-02-15 09:05:02
您只需要将UserManager类和SignInManager注入到任何您想访问该层的页面。
@using Microsoft.AspNetCore.Identity
@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager您可以访问您的帐户字段。我想这样做是为了让UserName
<ul class="navbar-nav">
@if (SignInManager.IsSignedIn(User))
{
<li class="nav-item">
<a id="manage" class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">Hello @UserManager.GetUserName(User)!</a>
</li>
<li class="nav-item">
<form id="logoutForm" class="form-inline" asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Page("/Index", new { area = "" })">
<button id="logout" type="submit" class="nav-link btn btn-link text-dark">Logout</button>
</form>
</li>
}
else
{
<li class="nav-item">
<a class="nav-link text-dark" id="register" asp-area="Identity" asp-page="/Account/Register">Register</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" id="login" asp-area="Identity" asp-page="/Account/Login">Login</a>
</li>
}
</ul>这样做可以检查用户是否已登录。如果它们没有登录,它将显示else语句。如果它们被登录,它将显示其他选项。
如果您想访问其他层,将服务注入您的前端并执行类似的操作。
public class DashboardService
{
#region Private Variables
private readonly IHttpContextAccessor _accessor;
private readonly LinkGenerator _generator;
private readonly ApplicationDbContext _context;
private readonly UserManager<ApplicationUser> _userManager;
private readonly ILogger<DashboardService> _logger;
public DashboardService(ApplicationDbContext context,
UserManager<ApplicationUser> userManager,
IHttpContextAccessor accessor,
LinkGenerator generator,
ILogger<DashboardService> logger)
{
_context = context;
_userManager = userManager;
_accessor = accessor;
_generator = generator;
_logger = logger;
}
public async Task<string> GetuserInfo(ClaimsPrincipal userClaims)
{
//if user is not logged in this will return an error, but do we even allow this?
var user = await _userManager.GetUserAsync(userClaims);
string name = user.FirstName + user.LastName;
return name;
}
}然后在blazor页面上注入此服务。
@inherits OwningComponentBase<DashboardService>第三种方法。您可以将AuthenticationState添加到代码部分的blazor页面中,如下所示。
@code{
[CascadingParameter]
private Task<AuthenticationState> authenticationStateTask { get; set; }
protected override async Task OnInitializedAsync()
{
var user = (await authenticationStateTask).User;
deposits = await Service.GetDepositsAsync(user);
withdrawals = await Service.GetWithdrawalsAsync(user);
}
}https://stackoverflow.com/questions/71123513
复制相似问题