使用 Windows 身份验证的 Intranet 应用程序是否需要 ASP.NET Core Identity

2023-11-26

在 Intranet Web 应用程序中使用 Windows 身份验证我想实现以下目标:

  • 从 AD 收集其他属性(姓名、员工编号)
  • 从数据库表中收集其他属性(工作时间、工资)
  • 根据应用程序角色(而不是 AD 组)进行授权
  • 基于 AD 属性授权(有直接报告)
  • 用户未提供用户名/密码

在我寻找答案时建议我需要添加ClaimsTransformation到我的应用程序:

如何对数据库中的用户使用 Windows 身份验证

使用 .Net Core 中的 Windows Authenticated 应用程序从 SQL 填充自定义声明

.net core 2.0 中的缓存声明

虽然我不完全理解解决方案以及原因ClaimsTransformation每个请求都会发生,所以我正在寻找以下问题的答案:

  1. ASP.NET Core Identity 是否需要ClaimsTransformation上班?
  2. Does ClaimsTransformation仅使用 Windows 身份验证或基于表单的身份验证会在每个请求上发生吗?
  3. 每个请求都必须发生这种情况吗?
  4. 缓存诸如GivenName、Surname之类的声明看起来很简单,但是角色呢?需要采取哪些步骤来确保数据库不会每次都受到影响,但角色会在发生更改时得到更新。
  5. 对于我想做的事情有更简单的选择吗?

这是使用 IClaimsTransformation 的替代方案(使用 .NET 6)

一些注意事项:

在 ClaimsTransformer 类中,克隆现有的 ClaimsPrincipal 并将您的 Claims 添加到that,而不是试图修改现有的。然后必须在ConfigureServices() 中将其注册为单例。

mheptinstall 的答案中用于设置 AccessDeniedPath 的技术在这里不起作用,相反,我必须使用 UseStatusCodePages() 方法才能重定向到 403 错误的自定义页面。

新声明必须使用类型创建newIdentity.RoleClaimType, NOT System.Security.Claims.ClaimTypes.Role,否则为 AuthorizeAttribute(例如[Authorize(Roles = "Admin")]) 不管用

显然,应用程序将设置为使用 Windows 身份验证。

ClaimsTransformer.cs

public class ClaimsTransformer : IClaimsTransformation
{
    // Can consume services from DI as needed, including scoped DbContexts
    public ClaimsTransformer(IHttpContextAccessor httpAccessor) { }

    public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        // Clone current identity
        var clone = principal.Clone();
        var newIdentity = (ClaimsIdentity)clone.Identity;

        // Get the username
        var username = principal.Claims.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier || c.Type == ClaimTypes.Name).Value;

        if (username == null)
        {
            return principal;
        }

        // Get the user roles from the database using the username we've just obtained
        // Ideally these would be cached where possible
        
        // ...

        // Add role claims to cloned identity
        foreach (var roleName in roleNamesFromDatabase)
        {
            var claim = new Claim(newIdentity.RoleClaimType, roleName);
            newIdentity.AddClaim(claim);
        }

        return clone;
    }
}

启动.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(IISDefaults.AuthenticationScheme);
    services.AddAuthorization();
    services.AddSingleton<IClaimsTransformation, ClaimsTransformer>();

    services.AddMvc().AddRazorRuntimeCompilation();

    // ...
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseStatusCodePages(async context => {
        if (context.HttpContext.Response.StatusCode == 403)
        {
            context.HttpContext.Response.Redirect("/Home/AccessDenied");
        }
    });

    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

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

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

Example HomeController.cs

[Authorize]
public class HomeController : Controller
{
    public HomeController()
    { }

    public IActionResult Index()
    {
        return View();
    }

    [Authorize(Roles = "Admin")]
    public IActionResult AdminOnly()
    {
        return View();
    }

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

使用 Windows 身份验证的 Intranet 应用程序是否需要 ASP.NET Core Identity 的相关文章

随机推荐

  • 如何在 JMeter 中进行 OAuth 2.0 身份验证?

    我正在尝试对一些需要身份验证的 API OAuth 2 0 进行功能测试 并在 JMeter 中进行模拟 我正在尝试验证 Azure 云的 OAuth 服务 有没有人能够成功创建 JMeter HTTP 请求来针对 OAuth 2 0 进行
  • 在文本选择上显示自定义菜单

    您好 我希望能够在用户选择一些与媒体提供的文本非常相似的文本时显示自定义菜单 或上下文菜单 如何实现这样的事情 我知道本机 jquery 上下文菜单插件 但我如何知道用户何时选择文本 浏览器的onselect似乎仅在输入元素上受支持 这是一
  • PHP 的合并函数?

    许多编程语言都有合并函数 返回第一个非 NULL 值 example 遗憾的是 2009 年 PHP 还没有做到这一点 在 PHP 本身获得合并函数之前 在 PHP 中实现一个合并函数的好方法是什么 php 5 3 中有一个新的运算符可以执
  • 如何在 cmd start 中使用引号?

    这是我想做的事 start wait c Program Files NetDrive2 nd2cmd exe c m t ftp blabla If I do start wait c Program Files NetDrive2 nd
  • 如何在 Anaconda Env 中启动 Visual Studio Code

    我在 Windows 10 PC 上的 Visual Studio Code 中运行 Python 程序时遇到问题 当我从终端启动 python 会话并说import cv2我没有收到任何错误 当我通过命令提示符并启动时VSCode从环境中
  • 为什么 UI 元素必须始终从 UI 线程创建/更新?

    为什么 UI 元素必须始终从 UI 线程创建 更新 在 几乎 所有编程语言中 UI 元素只能从 UI 线程安全地访问 修改 我知道这是一个标准的并发访问和同步问题 但真的有必要吗 这种行为是由编程语言还是操作系统强加的 有没有什么编程语言可
  • Django - 仅包含日期部分的分组

    MyModel objects filter created at gte 2011 03 09 created at lte 2011 03 11 values created at status annotate status coun
  • 作为 Cowboy 客户端,您如何使用 Gun?

    我跟着入门说明对于 Cowboy 我让 Cowboy 在端口 8080 上运行并侦听 然后我得到了Hello Erlang 当我进入时的回应http localhost 8080在我的浏览器中 现在 如何使用 Gun 连接到 Cowboy
  • 在类中,“using Base::BaseOfBase;”应该做什么?

    考虑这段代码 include
  • GWT 中的配置参数存储在哪里?

    我可以在客户端哪里存储配置参数 我无法在 Servlet init 参数 web xml 中存储参数 因为我必须使用 PHP 那么我如何在客户端存储初始化应用程序参数 例如 PHP 脚本位置 一些密码等 为此 您有以下选择 将数据存储在客户
  • 对数组进行排序并反映另一个数组中的变化

    我有一个双精度数组 用 Java 编写 arr1我想要排序 最有可能的第一个选项是实用方法Arrays sort double 我的想法是我想要相同的更改 例如 值index i与值互换index j in arr1 反映在另一个整数数组中
  • 如何更改 Flutter 中 EditText 上气泡(光标下)的颜色

    如何更改在 Text 或 TextFormField 或 Flutter 中选择文本时出现的气泡的颜色 Here是同样的问题 但是对于本机代码 根据这个颤振文档 textSelectionHandleColor已弃用 你应该使用select
  • Scala 对现有变量的多重赋值

    我可以做类似的事情 def f Tuple2 String Long val a b f 如果变量已经存在怎么办 我在过滤器上运行相同的数据集 但我不想链接它们 长名称等 这是我尝试过的 但它抱怨期待 而不是最后一行的 var a init
  • 为什么原型函数不影响console.log?

    我制作了原型Function这样它就有一个 getBody 函数 Function prototype getBody function Get content between first and last var m this toStr
  • 列表视图有多个分割按钮吗?

    基于 JQuery Mobile 的示例拆分按钮列表我正在尝试在 Android 中生成一个列表视图组件 右侧有两个额外的按钮 一个紧挨着另一个 问题在于该代码仅生成一个按钮 第二个按钮作为当前项目的链接添加 这是我的代码 ul li a
  • 什么是控制字符的正则表达式?

    我试图匹配 c 形式的控制字符 其中 c 是控制字符的任何有效字符 我有这个正则表达式 但它当前不起作用 z 我认为问题在于插入符 是正则表达式解析引擎的一部分 匹配以下形式的 ASCII 文本字符串 X使用模式 仅此而已 匹配以下形式的
  • 如何将自己从事件处理程序中删除?

    我想做的基本上是从事件中删除函数 而不知道函数的名称 我有一个FileSystemWatcher 如果创建 重命名文件 它会检查其名称 如果匹配 则会将其移动到特定位置 但是 如果文件被锁定 它会生成一个附加到计时器的滴答事件的 lambd
  • 通过 TCP 连接发送大文件

    我需要通过互联网将一些大文件发送到计算机 结果我打开了路由器上打算使用的端口并转发相应的IP地址 无论如何 让我向您展示我为了实现这一目标而一直在努力的课程 这些类对于小文件工作得很好 但有时对于大文件则失败 这是服务器的代码 它是一个控制
  • 如果 getc() 通过 SIGINT 退出,则 getc() 后面的未定义行为是否会改变程序行为

    根据 未定义行为 的现代解释 编译器有权假设不会发生导致未定义行为 不可避免 的事件链 并且可以消除仅适用于代码将要执行的情况的代码未定义的行为 这可能会导致未定义行为的影响及时倒退 并使本来可以观察到的行为无效 另一方面 如果除非程序终止
  • 使用 Windows 身份验证的 Intranet 应用程序是否需要 ASP.NET Core Identity

    在 Intranet Web 应用程序中使用 Windows 身份验证我想实现以下目标 从 AD 收集其他属性 姓名 员工编号 从数据库表中收集其他属性 工作时间 工资 根据应用程序角色 而不是 AD 组 进行授权 基于 AD 属性授权 有