IClaimsTransformation 未被调用

2024-06-18

我正在开发 ASP.NET Core Web 应用程序 (.NET 5.0)。 这是一个 Intranet 应用程序,因此我使用 Windows 身份验证。 对于授权,我使用 AspNetCore.Identity 中的自定义角色(出于各种原因不想使用 AD 组)。 我正在使用IClaimsTransformation类来实现TransformAsync方法,以便将我的自定义角色添加到用户的声明中。 我添加了[Authorize(Roles = "Admin")]在控制器上测试整个方案。

当我在调试(IIS Express)中测试时,TransformAsync方法永远不会被调用。

我确实检查了我的 IIS 中是否启用了 Windows 身份验证launchSettings.json:

  "iisSettings": {
    "windowsAuthentication": true,
    "anonymousAuthentication": false,
    "iisExpress": {
      "applicationUrl": "http://localhost:49861",
      "sslPort": 44307
    }

我还检查了是否为调试模式启用了 windowsAuthentication (IIS Express):在此输入图像描述 https://i.stack.imgur.com/XP3hX.png

下面是我的ConfigureServices方法 (startup.cs) :

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

            // Windows Authentication
            services.AddAuthentication(IISDefaults.AuthenticationScheme);

            // Claim transformation
            services.AddScoped<IClaimsTransformation, AddRolesClaimsTransformation>();

            //ASP Identity
            services.AddIdentity<ApplicationUser, IdentityRole>().AddEntityFrameworkStores<ApplicationDbContext>();

        }

这是我的Configure方法 (startup.cs) :

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Home/Error");
                app.UseHsts();
            }
            app.UseHttpsRedirection();
            app.UseStaticFiles();

            app.UseRouting();
            app.UseAuthentication();
            app.UseAuthorization();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllerRoute(
                    name: "default",
                    pattern: "{controller=Event}/{action=Dashboard}/{id?}");
            });
        }

这是TransformAsync方法 :

public class AddRolesClaimsTransformation : IClaimsTransformation
    {
        private readonly UserManager<ApplicationUser> _userManager;

        public AddRolesClaimsTransformation(UserManager<ApplicationUser> userManager)
        {
            _userManager = userManager;
        }

        public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
        {
            //code removed for simplicity - this never gets called 
        }
  }

我尝试更改顺序services.AddAuthentication(IISDefaults.AuthenticationScheme) in startup.cs如本中所建议的post https://stackoverflow.com/questions/65167381/iclaimstransformation-not-firing但这并没有解决问题。

我缺少什么?


我终于找到了自己问题的解决方案。 解决方案是将调用更改为services.AddAuthentication() in ConfigureServices方法 (startup.cs) 如下:

BEFORE:

services.AddAuthentication(IISDefaults.AuthenticationScheme);

AFTER:

services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = IISDefaults.AuthenticationScheme;
            });

这是完整的代码ConfigureServices方法 (startup.cs):

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

    //ASP Identity
    services.AddIdentity<ApplicationUser, IdentityRole> 
    ().AddEntityFrameworkStores<ApplicationDbContext>();

    // Claim transformation
    services.AddScoped<IClaimsTransformation, AddRolesClaimsTransformation>();

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

IClaimsTransformation 未被调用 的相关文章

随机推荐

  • H2O服务器崩溃

    去年我一直在使用 H2O 我已经厌倦了服务器崩溃 我已经放弃了 夜间发布 因为它们很容易被我的数据集崩溃 请告诉我在哪里可以下载稳定的版本 Charles 我的环境是 Windows 10 企业版 内部版本 1607 具有 64 GB 内存
  • 如何在c#中加载私有ecdsa密钥es256?

    我使用以下命令生成 ES256 私钥和公钥 创建私钥 openssl ecparam genkey name prime256v1 noout out private pem 创建公钥 openssl ec in private pem p
  • 缺少 1 个必需的位置参数 [重复]

    这个问题在这里已经有答案了 class classname def createname self name self name name def displayname self return self name def saying s
  • GitHub Pages (github.io) doxygen 生成的页面未找到 (404)

    我不明白为什么找不到 doxygen 生成的页面 404 它在Github存储库中的路径是https github com AubinMahe AubinMahe github io blob master doxygen html dd
  • ASP.NET Core 应用程序生命周期

    目前是否有关于生命周期的 ASP NET Core 文档 我希望能够在正确的点融入生命周期 它与现有的 ASP NET MVC 5 生命周期相似吗 http www asp azureedge net v 2016 09 01 001 me
  • 如何在 RxSwift 中延迟地从 Collection 中一件一件地发出项目

    我想从anyCollection 创建一个Observable 它会在延迟后一一发出每个元素 另外 在下一步我想对项目 模型 执行一些更新 例如 喂所有狗 一只一只 间隔 5 秒 class Dog var name String var
  • 覆盖二维平面上给定点的最小圆

    问题 覆盖 2D 平面上给定 N 个点的圆的最小可能直径是多少 解决这个问题最有效的算法是什么 它是如何工作的 这是最小圆问题 http en wikipedia org wiki Smallest circle problem 请参阅参考
  • 如何在C#中使用谷歌语音识别API?

    我想从 C 获取音频文件并发送到谷歌语音识别 API 以获得 语音到文本 的答案 我的代码是这样的 try byte BA AudioFile GetFile filename HttpWebRequest HWR SpeechToText
  • 在android 10中设置通知操作的背景颜色

    我已经做到了这一点图片链接 https i stack imgur com o0Cel jpg通过关注这篇文章https medium com dcostalloyd90 show incoming voip call notificati
  • 更改所选控件的输入语言

    我的应用程序中有一个文本区域 我想以编程方式单独设置文本区域的输入语言 而不影响其他控件 不幸的是 您的程序无法完成此操作 用户需要使用 Unicode 键盘或输入法编辑器 IME 由于您使用的是 C Net 平台 因此您的程序已经能够处理
  • C 有标准的队列实现吗?

    是否有 C 语言 附带 的队列数据结构实现 或者我必须开发自己的队列数据结构实现 这是一个学校项目 因此我必须使用标准 gcc 安装中存在的东西 或者必须自己实现一个 其他通用数据结构 如链表 堆栈等 又如何呢 尝试这个 Unix 附带了几
  • 为什么 Javascript 中未定义的变量有时会计算为 false,有时会抛出未捕获的 ReferenceError?

    我读过的所有内容都表明 在 Javascript 中 未定义变量的布尔值是 False 我已经使用过这样的代码数百次 if elem 其目的是 如果 elem 未定义 则将执行块中的代码 它通常可以工作 但有时浏览器会抛出一个错误 抱怨未定
  • 无法使用 CLI Firebase auth:import 命令导入用户帐户

    我需要在 Firebase 中导入用户列表以及电子邮件和密码 我正在尝试使用 CLI auth import 命令在 Firebase 中导入用户 https firebase google com docs cli auth import
  • 有没有办法将 SVG 字符串渲染到 Web Worker 中的 OffscreenCanvas?

    我正在开发一个网页 对 SVG 字符串数据进行一些相当繁重的处理 因为这些字符串的大小可能达到 m bs 所以我想将 SVG 的渲染 取决于浏览器 移至工作人员 以避免阻塞 UI 我的问题是 worker 中无法访问 DOM 元素 有没有办
  • 从 MVC 控制器调用 Web API

    我的 MVC 5 项目解决方案中有一个 Web API 控制器 WebAPI 有一个方法可以将特定文件夹中的所有文件作为 Json 列表返回 name file1 zip path c 从我的 HomeController 我想调用这个方法
  • 使用自制程序和安装程序安装 gfortran 是否会产生冲突?

    我正在按照在线教程使用 homebrew 安装一些 Python 模块 其中一个步骤是安装 gfortranbrew install gfortran 后来 我尝试使用另一个第三方安装脚本来安装一些Python模块 之后我意识到该脚本所做的
  • 使用 RSpec 测试导轨金属/机架?

    假设我有一个名为 Preview 的 Metal 类 如何使用 RSpec 进行测试 当我尝试时 require spec helper describe Preview do it should return the posted con
  • GLSurfaceView onDrawFrame 清除行为

    我在使用 GLSurfaceView 时遇到了不同的行为 据我所知 程序有责任清除每帧的缓冲区 颜色和深度 这意味着 如果我不清除缓冲区 我将获得最后一帧的内容 或双缓冲的前一帧 似乎无论在某些设备上如何 缓冲区都会被清除 我在一些测试设备
  • Swift 仅删除字符串中的尾随空格

    SO 中的许多示例都固定两侧 即前导和尾随 我的要求只是关于尾随 我的输入文本是 保持我的左侧 期望的输出 保持我的左侧 当然 这个命令会删除两端 let cleansed messageText trimmingCharacters in
  • IClaimsTransformation 未被调用

    我正在开发 ASP NET Core Web 应用程序 NET 5 0 这是一个 Intranet 应用程序 因此我使用 Windows 身份验证 对于授权 我使用 AspNetCore Identity 中的自定义角色 出于各种原因不想使