AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 417483
Accepted
Luke Puplett
Luke Puplett
Asked: 2012-08-15 10:38:09 +0800 CST2012-08-15 10:38:09 +0800 CST 2012-08-15 10:38:09 +0800 CST

IIS 7 上 Web 服务的 ServicePrincipleName 设置

  • 772

我很混乱。

考虑以下:

  • 具有名为 DOM 的域的 Active Directory 环境
  • 具有 NetBIOS 名称 VS1 的 IIS 7 框
  • 为 VS1 提供别名的 DNS 记录作为 pineapple.london.uk.corp
  • 作为 DOM\PineappleService 运行的应用程序池
  • Windows 身份验证已启用。
  • 客户端使用 HttpWebRequest 调用盒子上的 XML/JSON ASP.NET 服务。

该服务调用网络上的工作站来收集信息。这在我使用 IIS Express 作为我运行的开发中有效,因为 IISX 只是一个 .exe

在生产中,服务工作正常,身份验证工作,但调用导致服务(作为 PineappleService 运行)访问网络上的内容的功能失败。

我怀疑是 SPN 注册问题,但我不知道要设置什么 SPN。

最近,我偶然发现了这篇文章,它似乎在说 fly in the face of other articles:

http://blogs.msdn.com/b/webtopics/archive/2009/01/19/service-principal-name-spn-checklist-for-kerberos-authentication-with-iis-7-0.aspx

请注意,它说

SPN 要求与上述相同。与 IIS 6.0 不同(在 IIS 6.0 中我们必须为应用程序池标识添加形式为 http/ 的 SPN),您不必为 Domain1\Username1 添加像 http/ 这样的 SPN。

所以我不知道什么是对的了。我不知道是否需要注册 HTTP SPN 或 HOST SPN 或使用 DNS 别名或 NetBIOS 名称,并将它们设置在 PineappleService 帐户或 VS1 计算机帐户上。

我不知道当我尝试时是否存在缓慢的 AD 复制问题,这意味着我必须在反复试验之间等待一个小时。

现在一切都那么复杂。我作为系统操作员和开发人员工作了 15 年,我感觉到域和工作站以及权利和政策的终结。这一切都变得太多了。

谢谢你的帮助。

卢克

active-directory
  • 2 2 个回答
  • 2536 Views

2 个回答

  • Voted
  1. Best Answer
    Greg Askew
    2012-08-17T07:43:37+08:002012-08-17T07:43:37+08:00

    在开发中完全按照生产中的方式对其进行配置和测试之前,不应尝试这样做。通过 IIS 和自定义应用程序使用 Windows 身份验证和模拟可能非常复杂。即使它在没有准确反映生产的开发环境的情况下神奇地在生产中工作,如果您不得不调查一个问题,您也会完全迷失方向。

    SPN

    创建 SPN 时,通常会同时为 fqdn 和短名称创建 SPN。例子:

    setspn.exe -A http/computer  
    setspn.exe -A http/computer.domain.com  
    

    建议这些名称与 pre-windows 2000 名称(netbios 名称)和连接到服务时将使用的 dns 名称相匹配。如果这些都不是将用于连接到服务的名称,则该名称也应该有一个 SPN。

    在不同帐户/计算机上为相同服务/名称注册的重复 SPN 是 Kerberos 委派无法正常工作的常见原因。Setspn 很乐意让您创建重复的 SPN。Microsoft 已发布一个修补程序来纠正此行为:

    在 Windows 7 或 Windows Server 2008 R2 中将 setspn 命令与 -a 开关一起运行时会注册重复的 SPN
    https://support.microsoft.com/kb/2717045

    服务所在的目标计算机需要 SPN。

       HTTP/computername.company.com
       HTTP/computername
    

    值得信赖的委派

    将执行模拟的计算机或用户帐户需要指定为受信任的委派。如果用户帐户正在执行模拟,则执行模拟的计算机帐户也必须以相同的方式配置为受信任的委派。

    在 Active Directory 用户和计算机中,单击计算机或用户帐户上的委派选项卡。(用户帐户不显示委派选项卡,除非它有 SPN。可能需要为用户帐户分配一个 SPN,如 RPC/用户名,以便出现委派选项卡)。

    在委派选项卡上,选择“信任此用户/计算机以委派任何服务(仅限 Kerberos)”以获得不受约束的委派。

    对于约束委派,选择“信任此用户/计算机仅委派指定服务”。选择“使用任何身份验证协议”。您可以单击“添加”并浏览到通告服务 SPN 的计算机,然后添加它们。请注意,当您运行 setspn.exe -L domain\useraccount 时,这些不会显示为 SPN。

    委托模型

    您需要确定要使用的委托模型。这个决定可能是出于安全原因。

    Unconstrained 允许计算机或服务帐户模拟任何用户。这是非常强大的,许多组织都避免了。

    约束委派将模拟活动限制为执行模拟的服务帐户可能连接到的特定目标计算机和服务(HTTP、CIFS 等)。它还具有额外的便利性,即无需帐户的凭据或预先存在的 Windows/Kerberos 安全令牌即可模拟任何帐户。

    多个域

    如果 FE/BE 服务器在不同的域中,则约束委派不起作用。

    使用约束委派,执行模拟的帐户/计算机必须与目标资源/服务位于同一域中。该域通常是“资源”域。被模拟的帐户可能位于任何受信任的域中,包括其他林中的受信任域。

    提升权限

    执行模拟的用户帐户必须在运行将执行模拟的代码的计算机上拥有 SetTCB 特权(作为操作系统的一部分)。请注意,在 Windows Vista/7/2008 上,SetTCB 权限可能仅由具有高完整性级别的进程持有,因此可能需要将该帐户添加到本地管理员组。

    授权用户身份必须是将执行模拟的计算机上本地用户组的成员。

    作为操作系统的一部分,可以使用 gpedit.msc 或 gpmc.msc 进行分配。它位于“计算机”>“Windows 设置”>“安全设置”>“本地策略”>“用户权限分配”下。

    Kerberos 第 5 版身份验证协议的工作
    原理 http://technet.microsoft.com/en-us/library/cc772815%28WS.10%29.aspx

    • 如果选择了仅使用 Kerberos 选项,则该帐户将使用没有协议转换的约束委派。
    • 如果选择使用任何身份验证协议选项,则该帐户将使用带协议转换的约束委派。

    哇!正确配置所有内容后,您可以将所有内容提炼成一个易于排除故障的简单测试用例。假设您已经为 CIFS\fileserver.company.com 创建了一个 SPN,并且想要模拟 [email protected] 并访问该服务器上的一个共享:

    // no password required with constrained delegation
    using (WindowsIdentity id = new WindowsIdentity("[email protected]"))
    using (WindowsImpersonationContext wic = id.Impersonate())
    {
        // ImpersonationLevel will be "Impersonation" when constrained delegation is setup correctly
        // It will be "Identification" if the account performing impersonation does not have SetTCB privilege
        Debug.WriteLine("ImpersonationLevel: " + id.ImpersonationLevel);
        // Authentication type should be "Kerberos"
        Debug.WriteLine("AuthenticationType: " + id.AuthenticationType);
        Debug.WriteLine("Username: " + WindowsIdentity.GetCurrent().Name);
    
        Debug.WriteLine("Groups:");
        foreach (IdentityReference identity in id.Groups)
        {
            NTAccount ntaccount = identity.Translate(typeof (NTAccount)) as NTAccount;
            Debug.WriteLine("Account: " + ntaccount.Value + " SID: " + identity.Value);
        }
    
        // This will fail with access denied if constrained delegation is not setup properly.  
        // On the target server/resource, if it fails it may show an attempt to logon using anonymous
        string[] fileNames = Directory.GetFiles(@"\\fileserver.company.com\ShareName");
        foreach (string fileName in fileNames)
        {
            Console.WriteLine(fileName);
        }
    }
    
    • 2
  2. Brent Pabst
    2012-08-16T11:55:02+08:002012-08-16T11:55:02+08:00

    这很可能根本不是 SPN 问题。在您的服务帐户 (PineappleService) 下运行的应用程序池很可能没有访问网络资源的权限。您并没有真正提供任何错误消息,但它确实听起来像是一个简单的权限问题。

    您需要确保您的服务帐户可以访问您尝试获取的任何内容(您应该在问题中详细说明),无论是文件、信息等。

    为了进行测试,您可以让您的服务帐户成为域中的管理员,但您绝对不应该像后期制作部署那样离开它。

    • 1

相关问题

  • 如果以域用户身份远程登录,PC 速度极慢

  • 如何在 Windows 2003 的 ou 级别应用策略

  • 允许用户更改其 Active Directory 密码的 Web 界面

  • MOSS 2007 无法使用 ActiveDirectoryMembershipProvider 配置表单身份验证

  • 通过 VPN 更改 Active Directory 密码

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve