在 Blazor WebAssembly 应用程序中授权普通 Razor 页面?

2023-12-10

我正在使用 Blazor Wasm 编写 SPA。我使用了标准模板并包含托管在服务器中的用户帐户,该服务器也创建了服务器应用程序。到目前为止一切都很好。 我想补充一点,我正在使用 .Net5 RC2,但我认为这不是我的问题。

我希望在服务器和客户端应用程序中都有一些“正常”的剃刀页面。用户帐户身份服务器创建了文件夹结构 /Areas/Identity/Pages/... 我添加了 /Areas/Management/Pages/Admin/Test.cshtml 和 Test.cshtml.cs 这些是非常简单的测试文件......

EDIT- 我对此进行了编辑以反映@enet 提出的问题。

剃须刀文件:

        @page
        @model ProjName.Server.Areas.Management.Pages.Admin.TestModel

        <h1>Test Page</h1>

    @if (User.Identity.IsAuthenticated)
    {
        @if (User.IsInRole("Administrator"))
        {
            <h2>User is Admin</h2>
        }
        else
        {
            <h2>User is not an admin</h2>
        }
    }
    else
    {
        <h2>User is Not Authenticated</h2>
    }

        @{
        }

.CS 文件:

        namespace ProjName.Server.Areas.Management.Pages.Admin
        {
            [Authorize]    <<<--- See case B.
            public class TestModel : PageModel
            {
                public void OnGet()
                {
                }
            }
        }

我想看到页面显示用户是管理员,或者用户不是管理员。 情况A:如果删除[授权],页面将加载,但始终显示用户未授权。因此,页面正在呈现,简单的测试会产生“else”情况。 在情况 B 中:页面根本不会呈现。 (此页面无法正常工作! - 来自浏览器的消息)。所以,根据我的研究,在这一点上:Razor 页面授权约定

我改变了我的startup.cs:

           services.AddRazorPages();

to this:

            services.AddRazorPages(options =>
        {
            options.Conventions.AuthorizeAreaFolder("Management", "/Admin");

        });

***我已经把上面的内容拿出来并重置为原来的样子***

当我这样做时,无论 .cs 文件中是否有 [Authorize],都会出现与情况 B 相同的结果。当您阅读文档时,我想这是有道理的。

所以我想我需要传回某种形式的授权令牌,或者?

身份页面不需要任何授权,因此这不是问题。 我的配置服务如下所示:

            public void ConfigureServices(IServiceCollection services)
            {
                services.AddDbContext<RGDbContext>(options =>
                    options.UseSqlServer(
                        Configuration.GetConnectionString("DefaultConnection")));

                services.AddDatabaseDeveloperPageExceptionFilter();

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

                // This was put in to try to sort this https://github.com/dotnet/AspNetCore.Docs/issues/17517
                //services.Configure<IdentityOptions>(options =>
                //    options.ClaimsIdentity.UserIdClaimType = ClaimTypes.NameIdentifier);

                services.AddIdentityServer()
                    .AddApiAuthorization<ApplicationUser, RGDbContext>(options => {
                        options.IdentityResources["openid"].UserClaims.Add("name");
                        options.ApiResources.Single().UserClaims.Add("name");
                        options.IdentityResources["openid"].UserClaims.Add("role");
                        options.ApiResources.Single().UserClaims.Add("role");
                    });

                services.AddAuthentication()
                    .AddIdentityServerJwt();



                services.AddControllersWithViews();
                //services.AddRazorPages();
                services.AddRazorPages(options =>
                {
                    options.Conventions.AuthorizeAreaFolder("Management", "/Admin");

                });
                

                .... more of my own stuff...

*** 导航到服务器页面是通过 NavMenu 中的按钮触发“onclick”事件来实现的:

    private void ServerPageTest()
    {
        Navigation.NavigateTo("/Management/Admin/Test", true);
    }

我有一种感觉,我在创业中缺少一些选择,任何想法。


我心里已经有了答案,我想……

更改 Startup.cs 文件,其中我们有:

        services.AddAuthentication();

我把它改为:

        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme;
            options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme;
        })

然后,服务器可以通过身份验证来提供 Razor 页面。

它还具有另一个副作用,即改变了服务器对声明的感知方式,并导致任何 API 控制器能够以更传统的控制器方式工作。我会解释一下。我还有一个带有 api 端点“AddUpdateUser”的“ApplicationUserController”,它按照罐头上的说明执行操作。

我有这个代码来检查登录的用户:

       public async Task<ActionResult<ApplicationUserDTO>> AddUpdateUser(ApplicationUserDTO sentUser)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        // Get the logged in user.
        // This line should work but doesnt and I dont know why.
        ApplicationUser loggedinUserX = await _userManager.GetUserAsync(User).ConfigureAwait(false);

但它总是返回 null。因此我不得不使用以下代码从声明中查找 userID:

        string loggedinUserId = User.FindFirstValue(ClaimTypes.NameIdentifier);
        ApplicationUser loggedinUser = _context.Users.Find(loggedinUserId);

我也必须搜索如何做到这一点。当然是在这个很棒的网站上找到的。

但是将这两行添加到启动中,破坏了这段代码并使原始代码可以工作。我想我现在明白为什么了,人们说“阅读文档”很好,但有时这太令人难以承受了。

无论如何,我希望这对一些人有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Blazor WebAssembly 应用程序中授权普通 Razor 页面? 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 按成员序列化

    我已经实现了template
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 查找c中结构元素的偏移量

    struct a struct b int i float j x struct c int k float l y z 谁能解释一下如何找到偏移量int k这样我们就可以找到地址int i Use offsetof 找到从开始处的偏移量z
  • JQuery Mobile 与 MVC 的链接

    我正在使用 ASP NET MVC 3 和 Razor UI 设置 JQuery 移动网站 我正在生成我的链接 例如 a href See Group 2 a 假设我从 Home Index 访问它 我遇到的问题是 当我点击链接时 它会出现
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • WPF/C# 将自定义对象列表数据绑定到列表框?

    我在将自定义对象列表的数据绑定到ListBox in WPF 这是自定义对象 public class FileItem public string Name get set public string Path get set 这是列表
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • cmake 将标头包含到每个源文件中

    其实我有一个简单的问题 但找不到答案 也许你可以给我指一个副本 所以 问题是 是否可以告诉 cmake 指示编译器在每个源文件的开头自动包含一些头文件 这样就不需要放置 include foo h 了 谢谢 CMake 没有针对此特定用例的
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co

随机推荐

  • Delphi:2010 年索引属性的 RTTI?

    请原谅以下代码示例的冗长 使用 Delphi 2009 我创建了两个类 TOtherClass 和 TMyClass TOtherClass class TObject public FData string end TMyClass cl
  • 为什么 drop1 忽略混合模型的线性项?

    我有六个固定因素 A B C D E and F 和一个随机因素R 我想使用 R 语言测试线性项 纯二次项和双向交互 因此 我构建了完整的线性混合模型并尝试使用drop1 full model lt lmer Z A B C D E F I
  • 在 Windows 上取消 python 中的停滞文件复制

    在 Windows 上 我想使用 Python 通过网络复制一堆文件 有时 网络没有响应 复制会停止 我想检查是否发生这种情况 并在发生这种情况时跳过有问题的文件 通过询问这个相关问题here 我发现了关于复制文件Ex函数 允许使用回调函数
  • 如何对地图的值进行排序?

    有人可以给我提示吗 我想按列表的长度对地图的值进行排序 var chordtypes maj 0 4 7 M7 0 4 7 11 m7 0 3 7 10 6 0 4 7 9 9 0 4 7 10 14 sus2 0 2 7 sus4 0 5
  • 在 Python 中,如何搜索过去 24 小时内创建的文件? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我是 python 新手 我想查找过去 24 小时内创建的目录中的所有文件 如何过滤 24 小时窗口内创建的文件 该代码将在 Windows 计算机上的 Python 2 7 中
  • 跨多个数据帧的经纬度之间的最小距离

    我有一个名为 A 的数据框 其中纬度和经度位于不同的列中 样本数据 ID Lat Long a 10 773046 76 6392061 b 10 7751978 76 6368363 c 12 954027 78 988818 d 12
  • 为什么Iterable不提供stream()和parallelStream()方法?

    我想知道为什么Iterable接口不提供stream and parallelStream 方法 考虑下面的类 public class Hand implements Iterable
  • 为什么“colMeans()”和“rowMeans()”函数比使用“lapply()”的mean函数更快?

    我想问的是 从算法上来说 rowMeans and colMeans 函数如何优化速度 另外 考虑一下什么lapply 做 它设置对该函数的重复调用mean 因此 除了实际计算均值的开销 在快速 C 代码中完成 之外 lapply 版本反复
  • Sass 3.4 删除字符串上的正斜杠

    是否有解决方法或任何其他方法可以使其在 Sass 3 4 上工作 mixin icon name code name before content str slice x 1 1 code include icon test 4556 代码
  • 从 WordPress 中提取数据

    从 Wordpress 数据库提取数据的最佳方法是什么 我认为创建一个插件会很好 有没有可以完成这项工作的教程 或者有一个插件可以做到这一点 通过 JSON XML 拉取页面内容 干杯 米奇 这是该插件的链接 http wordpress
  • 指针比较

    C 和 C 中的指针是否支持比较运算符 gt lt 等 标准 我想精确地比较数组位置 在连续数组中比较内存偏移量 指针 是可以的 如果您的数组被实现为链表 例如 则节点可能遍布内存 因此指针比较是无意义的
  • JQuery 查找并更改字符串的样式

    我需要编写一个函数 在 HTML 页面中的所有内容中搜索特定字符串 如果找到 则更改文本的颜色 这可能吗 Thanks 你可以这样做 CSS someclass color red JavaScript p contains yourstr
  • 如何将“System::String ^”转换为“TCHAR”?

    我问了一个问题here涉及 C 和 C 通信 问题解决了 但又引发了新的问题 这将返回一个字符串 C return Marshal PtrToStringAnsi decryptsn InpData 这需要一个 TCHAR C lpAlph
  • 数据库特定的迁移代码[重复]

    这个问题在这里已经有答案了 我正在创建一个需要在多个数据库下运行的应用程序 我目前在迁移中有一些代码 我只想在特定数据库 postgresql 和 mysql 下运行 有什么方法可以设置吗 谢谢 您的迁移可以访问数据库连接connectio
  • NSArray 后面的方括号索引是什么意思? [复制]

    这个问题在这里已经有答案了 浏览 iTunes U 开发适用于 iPhone 和 iPad 的 iOS 7 应用程序以及第 3 讲幻灯片中的第 120 页 有一个测验问题询问以下代码行的作用 说实话 我有点困惑 希望有人能破解它 cardA
  • “~”运算符在此脚本中做什么? [复制]

    这个问题在这里已经有答案了 您好 我从特定索引中删除一个数组 我附带了这个脚本 var arr 1 2 3 4 var index 2 if index arr splice index 1 我谷歌 what does operator d
  • 使用Spring SpEL表达式获取Annotation中引用的动态参数

    我想做的是拥有一个看起来很像 Spring 提供的 Cacheable Annotation 的注释 在方法之上使用 如下所示 CleverCache key orders concat id public Order getOrder i
  • 通过管道传递多个参数和最后一个函数的结果

    我正在使用 Ramda js 构建一个管道 它接受三个参数 第一个函数需要这三个参数 其结果用于第二个函数 但是 第二个函数还需要初始参数之一 我无法弄清楚构建类似的东西的分支 在伪代码风格中 我需要这样的东西 const composed
  • OAuth、带参数的 POST 问题

    我正在使用 Jon Crosby 的开源 Objective C OAuth 库http code google com p oauthconsumer 对于一些不处理令牌的基本 http 身份验证 仅处理消费者密钥和消费者秘密 我的代码非
  • 在 Blazor WebAssembly 应用程序中授权普通 Razor 页面?

    我正在使用 Blazor Wasm 编写 SPA 我使用了标准模板并包含托管在服务器中的用户帐户 该服务器也创建了服务器应用程序 到目前为止一切都很好 我想补充一点 我正在使用 Net5 RC2 但我认为这不是我的问题 我希望在服务器和客户