我有一個帶有身份驗證的 blazor 服務器應用程式(單個用戶帳戶)。計劃是保留默認的 EF 資料庫來處理所有身份驗證內容,并擁有一個包含應用程式資料的單獨 SQL 資料庫,我通過自己的資料訪問層訪問該資料庫。
EF 資料庫將電子郵件地址存盤到用戶名,并在用戶登錄時將其顯示為“Hello, [email protected]”。由于我將用戶的名字和姓氏存盤在我的應用程式資料庫中,因此我希望文本更改為顯示名字:“你好,abc!”
出于某種原因,在 blazor 專案中,我們有:
- Shared/LoginDisplay.razor
- Pages/Shared/_LoginPartial.cshtml
- 區域/頁面/Shared_LoginPartial.cshtm
在 Shared/LoginDisplay.razor 檔案中,我設法顯示名字如下(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使用不同的方法:
頁面/共享/_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>
區域/身份/頁面/共享/_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頁面中相同的(異步)方法?
uj5u.com熱心網友回復:
您只需要將 UserManager 類和 SignInManager 注入您想要訪問該層的任何頁面。
@using Microsoft.AspNetCore.Identity
@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> 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>
<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>
第三種方法。您可以像這樣在代碼部分的 blazor 頁面上添加 AuthenticationState。
@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://www.uj5u.com/qianduan/424691.html
