首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在blazor服务器应用程序中的cshtml文件中获取身份信息

问在blazor服务器应用程序中的cshtml文件中获取身份信息
EN

Stack Overflow用户
提问于 2022-02-15 08:51:52
回答 1查看 798关注 0票数 1

我有一个带有身份验证的blazor服务器应用程序(单用户帐户)。计划是保留处理所有身份验证内容的默认EF数据库,并拥有一个单独的SQL数据库,其中包含应用程序数据,我通过自己的数据访问层访问这些数据。

EF数据库将电子邮件地址存储到用户名,并在用户登录时将其显示为"Hello,abc@xyz.com“。由于我将用户的姓名存储在我的应用程序数据库中,所以我希望更改文本以显示名称:“你好,abc!”

出于某种原因,我们在一个blazor项目中:

  • Shared/LoginDisplay.razor
  • Pages/Shared/_LoginPartial.cshtml
  • Areas/Pages/Shared_LoginPartial.cshtm

在Shared/LoginDisplay.Lazor文件中,我设法以如下方式显示了名字(IUserData来自于我的数据访问库):

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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页面相同的(异步)方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-15 09:05:02

您只需要将UserManager类和SignInManager注入到任何您想访问该层的页面。

代码语言:javascript
复制
@using Microsoft.AspNetCore.Identity

@inject SignInManager<ApplicationUser> SignInManager
@inject UserManager<ApplicationUser> UserManager

您可以访问您的帐户字段。我想这样做是为了让UserName

代码语言:javascript
复制
<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语句。如果它们被登录,它将显示其他选项。

如果您想访问其他层,将服务注入您的前端并执行类似的操作。

代码语言:javascript
复制
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页面上注入此服务。

代码语言:javascript
复制
@inherits OwningComponentBase<DashboardService>

第三种方法。您可以将AuthenticationState添加到代码部分的blazor页面中,如下所示。

代码语言:javascript
复制
@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);
}

}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71123513

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档