在 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 页面? 的相关文章

  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • asp.net 文本框文本模式数字,仅允许数字

    我只是想知道 ASP NET 中是否有一种方法只允许文本框中的数字textmode number 当我使用这个时
  • 我的线程图像生成应用程序如何将其数据传输到 GUI?

    Mandelbrot 生成器的缓慢多精度实现 线程化 使用 POSIX 线程 Gtk 图形用户界面 我有点失落了 这是我第一次尝试编写线程程序 我实际上并没有尝试转换它的单线程版本 只是尝试实现基本框架 到目前为止它是如何工作的简要描述 M
  • 向 ExpandoObject 添加方法时,“关键字 'this' 在静态属性、静态方法或静态字段初始值设定项中无效”

    我尝试向 ExpandoObject 添加一个动态方法 该方法将返回属性 动态添加 给它 但它总是给我错误 我在这里做错了什么吗 using System using System Collections Generic using Sys
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • Clang 编译器 (x86):80 位长双精度

    我正在尝试在 x86 Windows 平台上使用本机 80 位长双精度 海湾合作委员会选项 mlong double 80 https gcc gnu org onlinedocs gcc x86 Options html似乎不适用于 cl
  • 显示异常时的自定义错误消息:从客户端检测到潜在危险的 Request.Form 值

    我在我的 Web 应用程序中使用 ASP NET 的登录控件 当发生此异常时 我想在标签上显示一种有趣的错误类型System Web HttpRequestValidationException A potentially dangerou
  • 如何使用recv()检测客户端是否仍然连接(并且没有挂起)?

    我写了一个多客户端服务器程序C on SuSE Linux 企业服务器 12 3 x86 64 我为每个客户端使用一个线程来接收数据 我的问题是 我使用一个终端来运行服务器 并使用其他几个终端来运行服务器telnet到我的服务器 作为客户端
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 一个模型可以通过多个编辑器模板传递吗?

    我尝试使用编辑器模板显示视图模型 该模板在应用基本对象编辑器模板之前将模型包装在字段集中 My view model Mvc3VanillaApplication Models ContactModel using Html BeginFo
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • 如何挤出平面 2D 网格并赋予其深度

    我有一组共面 连接的三角形 即二维网格 现在我需要将其在 z 轴上挤出几个单位 网格由一组顶点定义 渲染器通过与三角形数组匹配来理解这些顶点 网格示例 顶点 0 0 0 10 0 0 10 10 0 0 10 0 所以这里我们有一个二维正方
  • 如何一步步遍历目录树?

    我发现了很多关于遍历目录树的示例 但我需要一些不同的东西 我需要一个带有某种方法的类 每次调用都会从目录返回一个文件 并逐渐遍历目录树 请问我该怎么做 我正在使用函数 FindFirstFile FindNextFile 和 FindClo
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • 如何在 JSF 中实现登录过滤器?

    即使用户知道某些页面的网址 我也想阻止某些页面的访问 例如 localhost 8080 user home xhtml 需要先登录 如果没有登录则重定向到 index xhtml 在 JSF 中如何做到这一点 我在谷歌上看到需要一个过滤器

随机推荐

  • 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 但我认为这不是我的问题 我希望在服务器和客户