代码之家  ›  专栏  ›  技术社区  ›  Troy Hunt

MSBuild部署是使用集成身份验证还是仅使用基本身份验证?

  •  36
  • Troy Hunt  · 技术社区  · 15 年前

    我正在将一个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个未经授权的结果。

    特别令人沮丧的是,我可以很高兴地使用集成的auth(只是不包括凭据)在包中运行deploy命令,但似乎无法从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属性?这似乎是现在唯一的障碍。

    4 回复  |  直到 15 年前
        1
  •  30
  •   Troy Hunt    15 年前

    答案是。。。

    我在上面编辑了当前标识的用户名(即使未在原始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调用添加username参数,它将插入当前标识,并遵从basic auth,后者将失败,因为没有密码。如果包含username参数但不给它一个值,那么它根本不包含在MSDeploy命令中。

        2
  •  4
  •   Mike Valenty    15 年前

    我在Microsoft.Web.Publishing.targets中看到:

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

    所以,看起来默认值是 Basic 从MSBuild运行时进行身份验证。然后我找到了这个 http://technet.microsoft.com/de-de/library/dd569001(WS.10).aspx

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

    我还没试过,但可能是 /p:AuthType=NTLM

        3
  •  0
  •   Mark    14 年前

    我可以让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: “/M:http://[服务器名称]/MSDEPLOYAGENTSERVICE”“/A:ntlm-allowUntrusted”

    产生:

    “C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe”-源:package='C:\hudson\jobs\Test\workspace\app\Test.Web\obj\Release\package\Test.Web.zip'-dest:auto,computerName='http://[服务器名称]/MSDEPLOYAGENTSERVICE',authtype='ntlm',includeAcls='False'-动词: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
  •  0
  •   BlabzX    6 年前

    把这个过程分成两个步骤对我来说很有效-

    1. 构建包

      msbuild.exe/p:DeployOnBuild=True/p:WebPublishMethod=Package/p:packageasinglefile=True/p:AllowUntrustedCertificate=True/p:CreatePackageOnPublish=True/p:SkipExtraFilesOnServer=True/p:PublishProfile=DevProfile/p:Configuration=dev

    2. 部署

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

        5
  •  -1
  •   Jules Clements    14 年前

    这起作用,我最初被目标文件分散了注意力,但意识到我的错误在连接字符串中,即试图使用https而不是http。

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