【问题标题】:How to Authorize AD users with .Net Core如何使用 .Net Core 授权 AD 用户
【发布时间】:2019-02-26 22:09:41
【问题描述】:

我正在尝试使用 Authorize 注释停止路由上的请求,但我无法让它与 Active Directory 一起使用。有人搞定这个了吗?

[HttpGet]
[Authorize(Roles = "DOMAIN\\Group A")]
[Route("/")] // GET: /
public IActionResult Index()
{
    return View();
}

注意:我也试过Authorize(Roles = @"DOMAIN\\Group A")

只是提供一些背景知识,我正在运行 Windows,Visual Studio Pro 2015(更新 3)

这是我的 project.json 文件中的一些内容:

"dependencies": {
    "Microsoft.AspNetCore.Authorization": "1.0.0",
    "Microsoft.AspNetCore.Mvc": "1.0.0",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
    "Microsoft.Extensions.Configuration.CommandLine": "1.0.0",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
    "Microsoft.Extensions.Configuration.Json": "1.0.0",
    "Microsoft.Extensions.Logging": "1.0.0",
    "Microsoft.Extensions.Logging.Console": "1.0.0",
    "Microsoft.Extensions.Logging.Debug": "1.0.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
    "Microsoft.NETCore.App": {
      "version": "1.0.0",
      "type": "platform"
    },
    "Swashbuckle.SwaggerGen": "6.0.0-beta901",
    "Swashbuckle.SwaggerUi": "6.0.0-beta901"
  }

【问题讨论】:

  • 你是说创建新项目时的“Windows Authentication”选项吗?或者您是否想使用 i.e. 身份通过 LDAP 或类似机制向 AD 注册?后一种不受支持(因此出于安全考虑没有开箱即用的解决方案),因此您必须为它实现自己的提供程序。另外,我相信 Windows 授权只会让您登录,但您不会拥有其中的角色。检查加载的声明上的 IPrincipal/ClaimsPrincipal 以查看其上是否有角色声明
  • @Tseng 我已经获得了身份验证,我需要授权(“你能做 x”,而不是“你是谁”)。此外,用户与服务器位于同一域中。如果我必须为 LDAP 身份验证使用单独的包,你能推荐一个吗?

标签: authorization asp.net-core


【解决方案1】:

您是否为集成身份验证配置了 IIS 和应用程序?

在您的 web.config 中,您是否将 asp.net 核心模块设置为转发 Windows 身份,通过设置 forwardWindowsAuthToken="true"

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" 
        modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="%LAUNCHER_PATH%" 
      arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" 
      stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="true" />
  </system.webServer>
</configuration>

在您的 program.cs 中,您是否已将 IIS 与 .UseIISIntegration() 集成?

var host = new WebHostBuilder()
    .UseKestrel()
    .UseContentRoot(Directory.GetCurrentDirectory())
    .UseIISIntegration()
    .UseStartup<Startup>()
    .Build();

您是否在 Startup.cs 的 ConfigureServices() 方法中添加了授权并将其放在 AddMvc() 之前?

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthorization();
    services.AddMvc();
}

当我准备好所有这些东西后,我可以很高兴地根据角色进行授权,例如,我将[Authorize(Roles = "REDMOND\\scottgu_org_fte")] 放在我的家庭控制器上,我就可以正常使用了。

使用@"REDMOND\\scottgu_org_fte" 不起作用,因为这会使字符串文字verbatim,所以它试图评估Domain\\group,而双斜杠是错误的。 @"REDMOND\scottgu_org_fte" 会起作用。

【讨论】:

【解决方案2】:

如果您只想按照标准 MVC 允许/拒绝用户,并使用 IIS 反向代理到 Kestrel,那么您可以添加 web.config 并添加

<system.webServer>
  <security>
    <authorization>
      <remove users="*" roles="" verbs="" />
      <add accessType="Allow" roles="my AD User Group" />
      <add accessType="Allow" roles="uk\myUsercode" />
    </authorization>
  </security>
</system.webServer>

【讨论】:

    猜你喜欢
    • 2019-10-30
    • 1970-01-01
    • 2021-10-23
    • 2023-03-14
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2020-11-13
    相关资源
    最近更新 更多