如何在 blazor 页面上使用 usermanager?

2023-12-09

你好社区我有一个问题如何使用usermanager in a blazor页面网络组装?通过注入:

@inject UserManager<ApplicationUser> UserManager;

我收到指示,表明缺少使用指令,因为 ApplicationUser 类位于服务器上,并且客户端无权访问服务器。

这是我在 blazor 页面中的代码:

@page "/index"
@inject AuthenticationStateProvider AuthenticationStateProvider
@using Microsoft.AspNetCore.Identity;
@inject UserManager<ApplicationUser> UserManager;

<button @onclick="@LogUsername">Write user info to console</button>
<br />
<br />
@Message

@code {
    string Message = "";

    private async Task LogUsername()
    {
        var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
        var user = authState.User;

        if (user.Identity.IsAuthenticated)
        {
            var currentUser = await UserManager.GetUserAsync(user);
            Message = ($"{user.Identity.Name} is authenticated.{ currentUser.Nombre }");
        }
        else
        {
            Message = ("The user is NOT authenticated.");
        }
    }
}

这是我的类 ApplicationUser:

    public class ApplicationUser: IdentityUser
        {
            public string Nombre { get; set; }
            public string ApellidoPaterno { get; set; }
            public string ApellidoMaterno { get; set; }
            public virtual Cliente InquilinoActual { get; set; }
        }

Image of an SQL Query


你不能使用UserManager来自在浏览器上运行的 WebAssembly Blazor 应用程序。一般来说,您不能在 WebAssembly Blazor 应用中使用与数据库访问相关的对象。相反,您通常创建 Web Api 操作方法,并使用 Fetch API (HttpClient) 访问这些方法。

您想从 User 对象中获取什么值?

What is Nombre?

不管是什么Nombre,您可以添加该值(Nombre) 作为声明并从以下位置访问它authState.User

UPDATE

首先,您应该创建一个名为 ApplicationUserClaimsPrincipalFactory 的服务类,该服务类用于将 Users 表中的表列值转换为添加到传递给 Blazor 客户端的 ClaimsPrincipal 对象的声明。

(服务器应用程序)ApplicationUserClaimsPrincipalFactory.cs

using AuthenticationStateProviderCustomClaims.Server.Models;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;


public class ApplicationUserClaimsPrincipalFactory : 
                       UserClaimsPrincipalFactory<ApplicationUser>
    {
        public ApplicationUserClaimsPrincipalFactory(UserManager<ApplicationUser> userManager, 
                                  IOptions<IdentityOptions> optionsAccessor) : base(userManager, optionsAccessor)
        {
        }

        protected override async Task<ClaimsIdentity> 
                 GenerateClaimsAsync(ApplicationUser user)
        {
            ClaimsIdentity claims = await 
                            base.GenerateClaimsAsync(user);

            
            claims.AddClaim(new Claim("name", user.Nombre));
            
            return claims;
        }
        
    }

启动.配置服务

将以下内容放在 .AddDBContext 下方:

services.AddScoped<ApplicationUserClaimsPrincipalFactory>();

            services.AddDefaultIdentity<ApplicationUser>(options => options.SignIn.RequireConfirmedAccount = true)
                .AddRoles<IdentityRole>()
                .AddEntityFrameworkStores<ApplicationDbContext>()
                .AddClaimsPrincipalFactory<ApplicationUserClaimsPrincipalFactory>();

services.AddIdentityServer() .AddApiAuthorization(选项 => {

  // Note: This settings may be superfluous as the name claim 
  // is added by default.              
  options.IdentityResources["openid"].UserClaims.Add("name"); 
  options.ApiResources.Single().UserClaims.Add("name");  

          });

  services.AddAuthentication().AddIdentityServerJwt();

客户端

运行此代码并查看其是否工作...如果不工作,请发布完整的错误报告

索引剃刀

@page "/"

@using System.Security.Claims
@using Microsoft.AspNetCore.Components.Authorization
@inject AuthenticationStateProvider AuthenticationStateProvider

<p>@_authMessage</p>

@if (_claims != null && _claims.Count() > 0)
{
    <ul>
        @foreach (var claim in _claims)
        {
            <li>@claim.Type: @claim.Value</li>
        }
    </ul>
}

<p>@_nombreMessage</p>


@code {
    private string _authMessage;
    private string _nombreMessage;
    private IEnumerable<Claim> _claims = Enumerable.Empty<Claim>();

    private async Task GetClaimsPrincipalData()
    {
        var authState = await AuthenticationStateProvider.GetAuthenticationStateAsync();
        var user = authState.User;

        if (user.Identity.IsAuthenticated)
        {
            _authMessage = $"{user.Identity.Name} is authenticated.";
            _claims = user.Claims;
            _nombreMessage =
            $"Nombre: {user.FindFirst(c => c.Type == ClaimTypes.Name)?.Value}";
        }
        else
        {
            _authMessage = "The user is NOT authenticated.";
        }
    }
    protected override async Task OnInitializedAsync()
    {
        await GetClaimsPrincipalData();
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 blazor 页面上使用 usermanager? 的相关文章

  • 将运算符 << 添加到 std::vector

    我想添加operator lt lt to std vector
  • Qt - QProcess 不工作

    我尝试启动 Internet Explorer 所以我使用下面的代码 QProcess process new QProcess this QString temp C Program Files Internet Explorer iex
  • C# 方法重载决策不选择具体的泛型覆盖

    这个完整的 C 程序说明了这个问题 public abstract class Executor
  • 传递 constexpr 对象

    我决定给予新的C 14的定义constexpr旋转并充分利用它 我决定编写一个小的编译时字符串解析器 然而 我正在努力保持我的对象constexpr将其传递给函数时 考虑以下代码 include
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 处理右值时的 insert 与 emplace

    std string myString std unordered set
  • 强制初始化模板类的静态数据成员

    关于模板类的静态数据成员未初始化存在一些问题 不幸的是 这些都没有能够帮助我解决我的具体问题的答案 我有一个模板类 它有一个静态数据成员 必须为特定类型显式实例化 即必须专门化 如果不是这种情况 使用不同的模板函数应该会导致链接器错误 这是
  • 即使没有异步,CallContext.LogicalGetData 也会恢复。为什么?

    我注意到CallContext LogicalSetData LogicalGetData不按照我期望的方式工作 内部设置的值async方法得到恢复即使没有异步或任何类型的线程切换 无论如何 这是一个简单的例子 using System u
  • C++中判断unicode字符是全角还是半角

    我正在编写一个终端 控制台 应用程序 该应用程序应该包装任意 unicode 文本 终端通常使用等宽 固定宽度 字体 因此要换行文本 只需计算字符数并观察单词是否适合一行并采取相应的操作 问题是 Unicode 表中的全角字符在终端中占用了
  • 从网页运行 ClickOnce 应用程序,无需用户操作

    我们有一个基于 Java 的 Web 应用程序以及用 C 编写的相同应用程序 如果 java 检查器发现客户端计算机上没有安装 Java 则应该运行该应用程序 这个想法是运行 C 单击一次 http en wikipedia org wik
  • 如何递归取消引用指针(C++03)?

    我正在尝试在 C 中递归地取消引用指针 如果传递一个对象 那就是not一个指针 这包括智能指针 我只想返回对象本身 如果可能的话通过引用返回 我有这个代码 template
  • 不可变类与结构

    以下是类与 C 中的结构的唯一区别 如果我错了 请纠正我 类变量是引用 而结构变量是值 因此在赋值和参数传递中复制结构的整个值 类变量是存储在堆栈上的指针 指向堆上的内存 而结构变量作为值存储在堆上 假设我有一个不可变的结构 该结构的字段一
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 将二变量 std::function 转换为单变量 std::function

    我有一个函数 它获取两个值 x 和 y 并返回结果 std function lt double double double gt mult double x double y return x y 现在我想得到一个常量 y 的单变量函数
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • 没有“对 *this”功能的右值引用的解决方法

    我有一个围绕可移动对象的代理容器类 并希望代理能够隐式生成对底层对象的右值引用 但仅当代理本身被移动时 我相信我将能够按照提案 n2439 实施此行为 将移动语义扩展到 this http www open std org jtc1 sc2
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR

随机推荐

  • Jquery 日期规则在 Firefox 和 IE 中不起作用

    我已经用 jquery 日期规则渲染了普通文本 日期规则在 chrome 中工作正常 但在 Firefox 和 IE 中不起作用 请查看我的代码块
  • MutableStateFlow 不适用于 MutableList

    这是我尝试使用的 MutableStateFlow 值 val songList MutableStateFlow
  • Maven + Spring + Hibernate:hibernate3-maven-plugin hbm2ddl 失败,原因为“由:java.lang.NullPointerException”

    由于 Spring 目前缺乏对 Hibernate 4 的支持 我不得不将 Hibernate 从版本 4 降级到版本 3 具体来说是 3 3 2 GA 并且现在项目在尝试使用 hbm2ddl 生成模式时无法构建 这个错误太模糊了 谷歌搜索
  • Spark DataSet 有效获取整行的长度大小

    我正在使用不同大小的数据集 每个数据集都有动态大小的列 对于我的应用程序 我需要知道字符的整个行长度 以估计整个行的大小 以字节或千字节为单位 整个行大小 以 KB 为单位 的结果将写入新列 private void writeMyData
  • 一次性打印多个UIWebView的内容

    我有一个 iPad 应用程序 它使用 WebViews 来显示 URL 列表 我希望能够一次性打印所有 WebView 而不用 PrintInteractionController 多次提示用户 问题是 PrintInteractionCo
  • 在 Pig 中的 ToDate(unix) 中指定时区

    在我的数据集中 我有 Unix 时间戳中的日期 我想将它们转换为 Apache Pig 中的日期时间 为此我可以使用ToDate 功能如所描述here 不过我知道我的 Unix 时间戳是 GMT UTC 但是使用转换ToDate 将导致我当
  • Python argparse 组合标志和变量

    我希望能够为我的程序指定一个选项 该选项既充当标志又充当变量 例如 我有一个名为 logging 的论点 如果未指定此参数 我希望将其设置为 false 即 action store true 但如果指定了该参数 我想做两件事 1 我想设置
  • 在android中使用本机opencv FileStorage

    我正在尝试编写一个 Android 应用程序 使用 opencv 计算关键点和描述符并存储它们 但是我在 cv FileStorage 方面遇到了麻烦 我实际上是通过文件路径抛出本机方法 相同的路径 不同的文件结尾 还用于在javaside
  • 房间持久性:错误:实体和 Pojo 必须具有可用的公共构造函数

    我正在将一个项目转换为 Kotlin 并且尝试将我的模型 也是我的实体 设为数据类 我打算使用 Moshi 转换来自 API 的 JSON 响应 Entity tableName movies data class MovieKt Prim
  • 在哪里可以找到并下载不同版本的 mscorwks.dll 和 mscordacwks.dll?

    我试图习惯使用 WinDbg 在能够获取故障转储时对其进行故障排除 但每次我这样做时 它似乎都会要求我提供不同版本的 mscorwks dll 和 mscordacwks dll 而我不这样做并不总是能够访问转储来源的机器 除了告诉最终用户
  • IOException 无法解析为类型错误

    在我的 Java 期末考试中 我们有一个关于 try catch 和 finally 调用的测试 异常 部分 当我尝试将示例代码放入 Eclipse 中时 我在 catch 和 throw 新区域中遇到错误 所有错误都显示 无法解析为类型
  • 通过主题自定义 Woocommerce 中的产品类别面包屑链接

    我正在尝试修改class wc breadcrumb php自定义我的产品页面面包屑中的产品类别链接 该文件位于 wp content plugins woocommerce includes 我尝试将子主题中的此文件复制并编辑为 wp c
  • 如何在ruby中仅在内存中创建zip文件?

    我想创建给定目录中所有 HTML 文件的 zip 文件 该 zip 文件将作为附件与目录中的其余文件一起通过电子邮件发送 到目前为止 如果我从 pony 发送任何附件是 HTML 文件 我尝试过的所有电子邮件客户端都无法阅读电子邮件 所以我
  • python中的//=有什么作用? [复制]

    这个问题在这里已经有答案了 我正在阅读http learnpythonthehardway org book ex37 html但我不明白是什么 符号确实如此 我感觉合理 a 9 a 3 a 3 gt True But a 9 a 3 a
  • 使用 igraph 中的 graph.tree 函数绘制树

    在 igraph 包的文档中有一个示例 igraph options plot layout layout reingold tilford plot graph tree 20 2 输出应将数据表示为树 但我得到的是 您显然需要指定根 l
  • 如何避免回调与 Promise 的嵌套结构? [完成的]

    我使用承诺来避免回调创建的嵌套结构 然而在这段代码中我仍然有一些嵌套 我做错了什么还是在这种情况下这是不可避免的 在这种情况下 我想检查并查看配置文件是否存在 如果不存在 我想创建它 DB getProfile id google then
  • 文章类别:加载顺序重要吗?

    我一直在网上搜索 试图找到我的问题的答案 但似乎找不到直接的答案 我在工作中经常使用文章类 但从来没有真正需要知道它们是否按顺序加载 即页面上首先出现的内容 Example div class example1 example2 examp
  • 有没有办法在 VSTS 发布管理中执行嵌套变量

    我在变量组中创建了一些具有以下名称的变量 CodeNetworkShare Dev CodeNetworkShare Test CodeNetworkShare Prod 我在发布定义中导入了这个变量组 然后我尝试了以下方法在发布定义中使用
  • 将 coxph 摘要从 R 导出到 csv

    如何将 cox proportional 危险模型的摘要从 R 导出到 csv 我通过函数 coxph 进行了测试 通过生存包 现在我想将其摘要导出到 csv 该怎么做 c lt coxph Surv x y summary c 我认为你需
  • 如何在 blazor 页面上使用 usermanager?

    你好社区我有一个问题如何使用usermanager in a blazor页面网络组装 通过注入 inject UserManager