【问题标题】:Can MSBuild deploy using integrated authentication or only basic?MSBuild 可以使用集成身份验证部署还是仅使用基本身份验证?
【发布时间】:2011-05-11 18:09:01
【问题描述】:

我正在将一个 Web 应用程序包从 MSBuild 命令行部署到 IIS6 上的 MSDepSvc,使用基本身份验证的以下命令可以正常工作:

MSBuild.exe Web.csproj
  /p:Configuration=Debug
  /p:DeployOnBuild=True
  /p:DeployTarget=MSDeployPublish
  /p:MsDeployServiceUrl=http://[server name]/MsDeployAgentService
  /p:DeployIisAppPath=DeploymentTestProject
  /p:MSDeployPublishMethod=RemoteAgent
  /p:CreatePackageOnPublish=True
  /p:username=***
  /p:password=***

但是,我真正想做的是删除用户名和密码参数,并以当前用户的身份回退到集成身份验证。此命令将进入构建服务器,我不希望在目标环境(MsDepSvc 所需)上具有管理员权限的帐户的纯文本凭据可见。我找不到任何有关如何执行此操作的文档,并且在我尝试发布时丢弃凭据返回 401 未经授权。

特别令人沮丧的是,我可以愉快地在带有集成身份验证的包中运行部署命令(只是不包括凭据),但我似乎无法从 MSBuild 命令行运行它。我正在尝试将包和部署流程封装到一个命令中而不编辑构建文件,这是目前唯一的方法。

有什么想法吗?

编辑 在与 Sayed 讨论并深入了解命令行输出后,在执行上面的 MSBuild 命令(没有用户名和密码参数)之后,正在调用以下 MSDeploy 命令:

msdeploy.exe
  -source:package='[project path]\Web\obj\Debug\Package\Web.zip' 
  -dest:auto,ComputerName='http://[server]/MsDeployAgentService',UserName='***',IncludeAcls='False',AuthType='NTLM'
  -verb:sync
  -disableLink:AppPoolExtension
  -disableLink:ContentExtension
  -disableLink:CertificateExtension
  -retryAttempts=2

您可以看到正在设置 UserName 属性,其值为当前登录用户的用户名。如果我把它拿出来直接运行上面的命令,部署就很好了。

那么在此基础上,为什么原来的 MSBuild 命令在调用 MSDeploy 时会插入 UserName 属性?这似乎是现在唯一的障碍。

【问题讨论】:

  • 如果将 UseMSDeployExe 设置为 true,该命令是否不包含 AuthType=NTLM???
  • 实际上,当我从 Visual Studio 发布到同一域上的另一台机器时,我遇到了挑战。输入我已经登录的凭据后,发布正常,底层 MSBuild 命令显示 AuthType='NTLM',但也包括我的凭据。所以我有点回到原来的命令了!
  • 对于 Visual Studio 2012,您需要完全省略 /P:UserName 属性。

标签: msbuild msdeploy


【解决方案1】:

将过程分为两个步骤对我有用 -

  1. 构建和打包

    msbuild.exe /p:DeployOnBuild=True /p:WebPublishMethod=Package /p:PackageAsASingleFile=true /p:AllowUntrustedCertificate=True /p:CreatePackageOnPublish=True /p:SkipExtraFilesOnServer=True /p:PublishProfile=DevProfile /p :配置=开发

  2. 部署

    msdeploy.exe -source:package='C:\packagelocation\dev.zip' -dest:auto,ComputerName='http://destinationserver/MsDeployAgentService',IncludeAcls='False',AuthType='NTLM' -verb:sync - disableLink:AppPoolExtension -disableLink:ContentExtension -disableLink:CertificateExtension -retryAttempts=2

【讨论】:

  • 如果我们在步骤#2 中部署,您知道为什么在步骤#1 中 DeployOnBuild 必须为 True 吗?
【解决方案2】:

这行得通,我最初被目标文件分心,但意识到我的错误出现在连接字符串中,即尝试使用 https 而不是 http。

MSBuild.exe Web.csproj /p:Configuration=Debug /p:DeployOnBuild=True /p:DeployTarget=MSDeployPublish /p:MsDeployServiceUrl=http://[serverName]/MsDeployAgentService /p:DeployIisAppPath=DeploymentTestProject /p: MSDeployPublishMethod=RemoteAgent /p:CreatePackageOnPublish=True /p:username=

【讨论】:

    【解决方案3】:

    我能够让 NTLM 按如下方式工作,其中该服务在 [服务器名称] 上具有管理员权限的帐户下运行。

    "C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" app\Test.Web\Test.Web.csproj /T:Clean /T:Package /P:Configuration=Release

    C:\hudson\jobs\Test\workspace\app\Test.Web\obj\Release\Package\Test.Web.deploy.cmd /Y "/M:http://[服务器名称]/MSDEPLOYAGENTSERVICE" /A:ntlm -allowUntrusted

    生成:

    "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -source:package='C:\hudson\jobs\Test\workspace\app\Test.Web\obj\Release\Package\Test .Web.zip' -dest:auto,computerName='http://[服务器名称]/MSDEPLOYAGENTSERVICE',authtype='ntlm',includeAcls='False' -verb:sync -disableLink:AppPoolExtension -disableLink:ContentExtension -disableLink :CertificateExtension -setParamFile:"C:\hudson\jobs\Test\workspace\app\Test.Web\obj\Release\Package\RapidPrototypeRequestSystem.Web.SetParameters.xml" -allowUntrusted

    【讨论】:

      【解决方案4】:

      答案是……

      根据我对当前身份的用户名的上述编辑,即使未在原始 MSBuild 调用中传递,当前身份的用户名仍然存在于 MSDeploy 命令中,我尝试重构参数以传递空用户名,如下所示:

      MSBuild.exe Web.csproj
        /p:Configuration=Debug
        /p:DeployOnBuild=True
        /p:DeployTarget=MSDeployPublish
        /p:MsDeployServiceUrl=http://[server name]/MsDeployAgentService
        /p:DeployIisAppPath=DeploymentTestProject
        /p:MSDeployPublishMethod=RemoteAgent
        /p:CreatePackageOnPublish=True
        /p:username=
      

      然后生成以下 MSDeploy 命令:

      msdeploy.exe 
        -source:package='[project path]\obj\Debug\Package\Web.zip' 
        -dest:auto,ComputerName='http://[server name]/MsDeployAgentService',IncludeAcls='False',AuthType='NTLM' 
        -verb:sync 
        -disableLink:AppPoolExtension 
        -disableLink:ContentExtension 
        -disableLink:CertificateExtension 
        -retryAttempts=2
      

      此调用不再包含 UserName 属性。所以简而言之,如果您不向 MSBuild 调用添加用户名参数,它将插入当前身份并推迟到基本身份验证,这将失败,因为没有密码。如果您包含用户名参数但不给它一个值,则它根本不包含在 MSDeploy 命令中。

      【讨论】:

      • 有没有办法让“发布 Web GUI”对话框执行此操作?它似乎坚持在生成 msdeploy.exe 命令之前提示输入凭据,因此它总是将 AuthType 设置为 Basic。
      • 有一个非常简单的方法可以解决 Yadyn 问题 - 当您遇到挑战时,只需点击“Enter”而不输入任何凭据。容易:)
      • 嗯,试过了,当使用 UseMsDeployExe=true 时,我可以看到它肯定会遗漏用户名/密码参数(终于!),但它仍然将 AuthType 设置为 Basic。这是使用 WMSvc 地址 (MsDeploy.axd) 时的情况......另外,我得说在不输入任何内容的情况下单击“确定”根本不直观。
      • 这是我们解决方案的一部分(在 TFS2013 上),我们还必须按照here 的描述修改注册表
      【解决方案5】:

      我查看了 Microsoft.Web.Publishing.targets 并看到了这个:

      <PropertyGroup>
        <NormalizePublishSettings ...>
        <AuthType Condition="'$(AuthType)'==''" >Basic</AuthType>
        <!--Supported value for $(MSDeployPublishMethod): WMSVC, RemoteAgent, InProc-->
        <MSDeployPublishMethod ... >WMSVC</MSDeployPublishMethod>
        ...
      </PropertyGroup>
      

      因此,从 MSBuild 运行时,默认值似乎是 Basic 身份验证。然后我发现了这个http://technet.microsoft.com/de-de/library/dd569001(WS.10).aspx

      authenticationType 指定 要使用的身份验证类型。这 可能的值为 NTLM 和 Basic。如果 wmsvc 提供程序设置是 指定,默认认证 类型是基本的;否则,默认 身份验证类型为 NTLM。

      我还没有尝试过,但可能类似于/p:AuthType=NTLM

      【讨论】:

      • 很好的发现,但它所解释的与我所观察到的不一致。我阅读该声明的方式是针对 MsDepSvc(即不是 WMSvc)进行部署,NTLM 应该默认发生。为了确定,我已经尝试使用 NTLM 的 AuthType 开关,但没有运气。
      • 我认为构建目标通过为 AuthType 指定它自己的默认值来覆盖 MSDeploy 的默认行为。这只是一个猜测。
      猜你喜欢
      • 2011-03-22
      • 2014-09-15
      • 1970-01-01
      • 2017-06-13
      • 2013-05-30
      • 2015-08-12
      • 2018-12-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多