MAUI AAD 身份验证 ClaimsPrincipal 且 IsAuthenticated 始终为 false

2023-12-11

我有一个在本地主机上运行的 MAUI 应用程序,当您启动该应用程序时,它会触发 microsoft 登录,在用户成功登录后,我发现 ClaimsPrincipal 和 IsAuthenticated 始终为 false。根据我的 Main.razor 组件,如果用户未经过身份验证,它会再次调用 RedirectToLogin 组件,并且我不知道如何在应用程序中授权我登录的用户,因此可能与 IsAuthenticated 为 false 有关。

我见过一些解决方案,他们说您必须构建 ClaimsPrincipal,将身份验证类型作为参数传递给 ClaimsIdentity,如下所示:

new ClaimsPrincipal(new Identity("something"))

问题是我已经从 AAD 获得了 ClaimsPrincipal,所以我不知道我应该做什么,因为我无法看到 AAD,因为它是由其他团队处理的。

这是我的 Main.razor 组件:

<Router AppAssembly="@typeof(Main).Assembly">
    <Found Context="routeData">
        <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
            <Authorizing>
                Authorizing...
            </Authorizing>
            <NotAuthorized>
                <RedirectToLogin />
            </NotAuthorized>
        </AuthorizeRouteView>
    </Found>
    <NotFound>
        <CascadingAuthenticationState>
            <LayoutView Layout="@typeof(MainLayout)">
                <p role="alert">Sorry, there's nothing at this address.</p>
            </LayoutView>
        </CascadingAuthenticationState>
    </NotFound>
</Router>

这是 RedirectToLogin 组件:

@using Microsoft.AspNetCore.Components.Authorization
@using OfficeManagerApp.Areas.Services.Implementations
@inject AuthenticationStateProvider AuthenticationStateProvider
@inject NavigationManager NavigationManager


<div class="loader loader-bouncing"><span>Redirecting...</span></div>

@code {
    
    protected override async Task OnInitializedAsync()
    {
        await ((ExternalAuthStateProvider)AuthenticationStateProvider)
            .LogInAsync();            
    
        NavigationManager.NavigateTo("/", forceLoad: true);
    }
}

这是我在ExternalAuthStateProvider类中查看CLaimsPrincipal的断点:

ExternalAuthStateProvider

这是我为此遵循的教程。

平台服务教程

ExternalAuth StateProvider 教程

我也有一个仅使用 PlatformService 教程来解决同样问题的解决方案。


过了一段时间我找到了解决方案!

基本上,您会收到来自 AAD 的 ClaimsPrincipal,但您必须使用 AAD ClaimsPrincipal 中的声明在应用程序内创建自己的 ClaimsPrincipal。

在ExternalAuthStateProvider.cs的LoginWithExternalProviderAsync()方法中,我执行了以下操作:

        private async Task<ClaimsPrincipal> LoginWithExternalProviderAsync()
        {
            var authenticationResult = await _platformService.GetAuthenticationResult();            

            var authenticatedUser = new ClaimsPrincipal(new ClaimsIdentity(authenticationResult.ClaimsPrincipal.Claims, "Basic"));            

            return await Task.FromResult(authenticatedUser);            
        }

你只需要这样做,然后它就起作用了!

额外的 - - - - - -

为了改善登录注销流程,我创建了一个LoginPage.razor:

@page "/login"
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.Authorization
@using OfficeManagerApp.Areas.Services.Implementations
@attribute [AllowAnonymous]

@inject AuthenticationStateProvider AuthenticationStateProvider
@inject NavigationManager NavigationManager

<button @onclick="Login">Log in</button>

@code
{
    public async Task Login()
    {
        await ((ExternalAuthStateProvider)AuthenticationStateProvider)
            .LogInAsync();

        NavigationManager.NavigateTo("/");
    }
}

更改了 RedirectToLogin,razor:

@inject NavigationManager NavigationManager


<div class="loader loader-bouncing"><span>Redirecting...</span></div>

@code {

    protected override void OnInitialized()
    {        
        NavigationManager.NavigateTo("/login");
    }
}

并添加了注销方法:

    private void Logout(){
        ((ExternalAuthStateProvider)AuthenticationStateProvider)
            .Logout();  
    }

还对我的 Main.razor 做了一些更改:

<CascadingAuthenticationState>
    <Router AppAssembly="@typeof(Main).Assembly">
        <Found Context="routeData">
            <AuthorizeRouteView RouteData="@routeData" DefaultLayout="@typeof(MainLayout)">
                <Authorizing>
                    Authorizing...
                </Authorizing>
                <NotAuthorized>
                    @if (!context.User.Identity.IsAuthenticated)
                    {
                        <RedirectToLogin />
                    }
                    else
                    {
                        <p>You are not authorized to access this resource.</p>
                    }                   
                </NotAuthorized>
            </AuthorizeRouteView>
        </Found>
        <NotFound>      
            <LayoutView Layout="@typeof(MainLayout)">
                <p role="alert">Sorry, there's nothing at this address.</p>
            </LayoutView>       
        </NotFound>
    </Router>
</CascadingAuthenticationState>

请注意,不要忘记添加到您的 _Imports.razor:

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

MAUI AAD 身份验证 ClaimsPrincipal 且 IsAuthenticated 始终为 false 的相关文章

  • Ruby on Rails - 复选框未保存到数据库?

    我有一个迁移 它使用布尔值并在其视图中生成一个复选框 但是 无论我单击什么 保存到数据库的值都不会受到影响 我的迁移看起来像这样 def self up create table blogposts do t t string title
  • Hapijs 在一个连接上同时使用 Http 和 Https

    New to Hapijs http hapijs com 并尝试使用它来创建一个应用程序 该应用程序对所有请求使用 HTTPS 并将 HTTP 重定向到安全连接 问题是应用程序进入 HTTPS 模式没有问题 但如果我将 URL 更改为 H
  • Git - 在特定提交之前压缩历史记录中的所有提交

    我有一个 Mercurial 存储库 正在将其转换为 Git 提交历史记录非常大 我不需要新存储库中的所有提交历史记录 一旦我将提交历史记录转换为 Git 并且在推送到新存储库之前 我想将某个标记之前的所有提交压缩为一个提交 所以 如果我有
  • 如何设置 Swashbuckle 与 Microsoft.AspNetCore.Mvc.Versioning

    我们有asp net core webapi 我们添加了Microsoft AspNetCore Mvc Versioning and Swashbuckle拥有招摇的用户界面 我们将控制器指定为 ApiVersion 1 0 Route
  • ftrace 是否允许捕获 Linux 内核的系统调用参数,或者仅捕获函数名称?

    目标是检查任何进程传递给特定系统调用 例如 exec open 等 的参数 来自官方文档 https www kernel org doc Documentation trace ftrace txt 没有描述记录函数参数的功能 主要查看
  • 如何制作饼图聚合数据源?

    Using 适用于 ASP NET MVC 的 Kendo UI 完整版 http www kendoui com 版本 2013 3 1119 2013年11月20日 如果我有这段代码 status chart kendoChart da
  • 在 url 中传递百分号 (%) 并使用 php 获取其准确值

    我正在尝试在 url 中传递百分号 例如 B6011000995504101 SB 但当我回声时 它又回来了 011000995504101 SB 我想要与在 URL 中传递的值完全相同的值 我尝试使用 urlencode 函数 但它给了我
  • 如何在不同的目录中执行python脚本?

    Solved对于可能觉得这有帮助的人 请参阅下面我的答案 我有两个脚本 a py 和 b py 在我当前的目录 C Users MyName Desktop MAIN 中 我运行 gt python a py 第一个脚本 a py 在我当前
  • 闪亮的本地部署错误:输入字符串 1 无效 UTF-8

    我很惊讶地发现一个突然的错误 我的 ShinyApp 停止工作并出现未知错误 提示 输入字符串 1 无效 UTF 8 即使在昨天 该应用程序也可以正常运行 但是突然停止了 下面是我运行时的错误描述runApp gt runApp Liste
  • ES6解构对象赋值函数参数默认值

    您好 我正在查看在传递函数参数时使用对象解构的示例对象解构演示 https developer mozilla org en US docs Web JavaScript Reference Operators Destructuring
  • C# 中成员访问中的问号是什么意思?

    有人可以向我解释一下以下代码中会员访问中的问号是什么意思吗 它是标准 C 的一部分吗 尝试在 Xamarin Studio 中编译此文件时出现解析错误 this AnalyzerLoadFailed Invoke this new Anal
  • 将蒙版图像作为 PNG 文件写入磁盘

    基本上 我从网络服务器下载图像 然后将它们缓存到磁盘上 但在这样做之前 我想屏蔽它们 我正在使用每个人似乎都指出的屏蔽代码 可以在这里找到 http iosdevelopertips com cocoa how to mask an ima
  • Java编程编译jar

    我有一个文本文件中的java源代码 必须在源代码中输入一些自定义的硬编码变量 然后将其转换为 jar 这是可行的 但是当我运行 jar 时 找不到 Main 类 当我用 WinRAR 解压 jar 文件时 我似乎找不到错误 当我通过 cmd
  • 美丽的汤刮 - 登录凭据不起作用

    尝试使用登录凭据抓取页面 payload email gmail com password urls login url https www spotrac com signin url https www spotrac com nba
  • dplyr::mutate 添加多个值

    网上有几个与此相关的问题dplyr Github 存储库 https github com hadley dplyr已经 并且至少有一个相关的问题 但没有一个问题完全涵盖了我的问题 我认为 在 dplyr mutate 调用中添加多列 ht
  • XmlDocument Save 使文件保持打开状态

    我有一个简单的 C 函数 可以创建一个基本的 XML 文件并保存 private void CreateXMlFile string Filename string Name string Company XmlDocument doc n
  • 如何使 Django 自定义管理命令参数不再需要?

    我正在尝试在 django 中编写自定义管理命令 如下所示 class Command BaseCommand def add arguments self parser parser add argument delay type int
  • 如何获取通过网络驱动器访问的文件的 UNC 路径?

    我正在 VC 中开发一个应用程序 其中网络驱动器用于访问文件 驱动器由用户手动分配 然后在应用程序中选择驱动器 这会导致驱动器并不总是映射到相同的服务器 我该如何获取此类文件的 UNC 路径 这主要是为了识别目的 这是我用来将普通路径转换为
  • 相当于 JavaScript 中 Ruby 的each_cons

    许多语言都曾提出过这个问题 但 javascript 却没有 Ruby 有方法Enumerable each cons https devdocs io ruby 2 5 enumerable method i each cons看起来像这
  • 通过jquery ajax()和serialize()提交html表单

    我想通过 jquery ajax 提交此表单 这是我所做的 但它不起作用 即表单正在提交并刷新页面 但我没有看到响应 即在同一页面上打印数组 HTML

随机推荐

  • 静态下拉到动态下拉 Coldfusion

    我是堆栈溢出的新手 我需要创建一个静态下拉列表 然后根据在静态下拉列表中选择的值创建动态下拉列表 只是 Coldfusion 和 html 没有其他花哨的东西 因此 从第一个下拉菜单中 用户可以选择 颜色 身份证 官员 学校 然后点击 继续
  • 在android中的gridview中拖放图像

    我正在开发一个示例 Android 应用程序来了解 Android 中的拖放操作 在应用程序启动时 我在网格视图上显示一些图像 现在我需要一次将一张图像拖到另一张图像的位置 将一个图像放到另一个图像上后 图像应该交换位置 我怎样才能实现它
  • 如何使所有 Core Data 对象继承自我的类而不是 NSManagedObject?

    我创建了自己的类 我希望使用 Core Data 而不是NSManagedObject interface MyManagedObject NSManagedObject id delegate 我不能使用类别 因为它声明了一个 ivar
  • 捕获组和间隔量词在 sed 正则表达式中不起作用

    在 Linux 中我可以运行命令 sed r s 2 0 1 2 filename 但是 当在 UNIX 中运行时 我不能这样做 r所以我尝试了 sed s 2 0 1 2 filename 我收到以下错误 sed command garb
  • 连接 pandas 数据框中的元组列表

    我想加入数据框中的元组列表 我尝试了几种在数据框中执行此操作的方法join与lambda import pandas as pd from nltk import word tokenize pos tag pos tag sents da
  • 具有自定义训练循环的 Tensorboard Graph 不包括我的模型

    我已经创建了自己的循环 如 TF 2 迁移指南中所示here 我目前只能看到图表 VISIBLE 下面的代码部分 我如何制作我的模型 在 NOT VISIBLE 部分 在张量板上可见 如果我没有使用自定义训练循环 我可能会选择记录在案 mo
  • 将类添加到画布元素 HTML5 和 CreateJS

    我在画布中用 for 循环生成 5 个圆圈 我想给它们一个类 这样我就可以用 jquery 控制它们 但我做错了 你们能弄清楚发生了什么事吗 var stage var quantity 6 width 60 height 60 circl
  • 实体框架向导在 MySQL 上崩溃

    我的问题类似于this one但崩溃发生在稍后 我must在 SQL Server 和 MySQL 之间互操作 EF 数据库优先模型 更具体地说 我的应用程序根据连接字符串和配置设置向 SQL Server 或 MySQL 发起普通 SQL
  • 在模板化控件中实现级联 DropDownList 绑定

    我有2个DropDownList我的表单上的控件 其中第二个使用SelectedValue第一个作为其绑定参数之一 Both DropDownList控件位于FormView InsertItemTemplate with Selected
  • 如何配置战争以便依赖战争中导出的库而不是服务器中的库?

    我想在 JBoss 4 2 中部署战争 但我无法控制它的目录 所以我无法替换jsf impl jar and jsf api jar 我的问题是 如何配置战争才能取决于jsf impl jar and jsf api jar在战争中导出而不
  • 保存 woocommerce 产品后,什么是 wordpress/woocommerce 钩子?

    我想在用户创建并保存产品数据后通过肥皂客户端将 woocommerce 产品数据发送到邮政公司的网络服务 所以我需要一个在用户创建产品后触发的钩子 我搜索了很多并找到了一些 wordpress 和 woocommerce 钩子 但它们都没有
  • 使用 javascript 和 django 将文本文件上传到服务器中的某个文件夹

    我需要上传一个包含一些数据的文本文件 来自我的local filesystem to say MEDIA URL uploadfolder 该文件将由我的函数之一处理django view 我创建了一个
  • 使用 EC2 作为代理连接到 Aurora Serverless

    不是重复的AWS Aurora MySQL 无服务器 如何从 MySQL Workbench 进行连接 Aurora Serverless 尚不支持公共连接 我使用 Cloud9 在与数据库相同的 VPN 上创建 EC2 实例 然后我从 C
  • scanf 在 C 循环后跳过[重复]

    这个问题在这里已经有答案了 define len 100 char sourceString len char command int main void while 1 printf nEnter source fgets sourceS
  • C# 中 Queue 的排队事件

    我是活动和代表的新手 如何为类型的对象实现排队事件Queue
  • Android IP地址与java

    我正在编写一款支持多人游戏的 Android 视频游戏 有一个正在运行的专用服务器 当通过打开套接字单击多人游戏按钮时 机器人会连接到该服务器 这工作正常 服务器基本上只是充当匹配系统 当客户端托管游戏时 服务器会将该客户端添加到主机列表中
  • CSS 形状创建曲线波

    这就是我到目前为止所得到的 查看教程后 I want know how curved effect is generated on divs the only question that i found near to what i was
  • TwiML 应用程序意外结束调用:找不到元素“响应”的声明

    我创建TwiML应用程序并设置语音请求 URL Web 部署 ASP NET MVC 应用程序操作方法 http voiceapp 001 site1 myasp net voice 当有人访问上面发布的 URL 时 将调用此操作方法 pu
  • 桌面 VSCode 与 Anaconda VSCode?

    我的电脑上已经安装了 vscode 不久前我注意到它现在包含在 anaconda 发行版中 与我已经安装的 vscode 相比 使用 anaconda 附带的 vscode 有什么好处吗 仅供参考 我是一名 Python 开发人员 如果这有
  • MAUI AAD 身份验证 ClaimsPrincipal 且 IsAuthenticated 始终为 false

    我有一个在本地主机上运行的 MAUI 应用程序 当您启动该应用程序时 它会触发 microsoft 登录 在用户成功登录后 我发现 ClaimsPrincipal 和 IsAuthenticated 始终为 false 根据我的 Main