替换 SharePoint 加载项中即将过期的客户端密码

使用 AppRegNew.aspx 页面注册的 SharePoint 加载项客户端密码会在一年后过期。 本文介绍如何添加加载项的新密码,以及如何创建有效期为三年的新客户端密码。

注意

本文介绍如何通过组织目录分发并使用 AppRegNew.aspx 页面注册 SharePoint 加载项。 如果在卖家面板中注册了加载项,请参阅在卖家面板中创建或更新客户端 ID 和密码

建议在密码过期前至少 30 天创建新机密。 这会在旧凭据过期之前的一个月时间。

建议在过期后至少 7 天内删除机密,前提是已将机密从应用程序配置中删除。

在从应用程序配置中删除过期的机密之前,从 ACS 中删除它将导致错误。

先决条件

在开始之前,请确认下列事项:

  • 开发计算机上已安装 Microsoft Online Services 登录助手。
  • 可以通过 PowerShell 连接至 Office 365:连接到 Office 365 PowerShell
  • 您是使用 AppRegNew.aspx 页面注册外接程序的 Office 365 租户的租户管理员(或场的场管理员)。

了解安装到 Office 365 租户的 SharePoint 外接程序的到期日期

  1. 打开 Windows PowerShell 并运行以下 cmdlet:

    Connect-MsolService
    
  2. 在登录提示符处,输入使用 AppRegNew.aspx 注册加载项的 Office 365 租赁或场的租户管理员(或场管理员)凭据。

  3. 生成一个报告,其中在下列行中列出每个外接程序及其密钥的到期日期。 对于此代码,请注意以下事项:

    • 它首先筛选出 Microsoft 自己的应用程序,即仍在开发的加载项(以及称为“自动托管”的已弃用的加载项类型)。
    • 然后从剩余的加载项中筛选出非 SharePoint 加载项以及使用非对称密钥的加载项,如工作流。
    $applist = Get-MsolServicePrincipal -all  |Where-Object -FilterScript { ($_.DisplayName -notlike "*Microsoft*") -and ($_.DisplayName -notlike "autohost*") -and  ($_.ServicePrincipalNames -notlike "*localhost*") }
    
    foreach ($appentry in $applist) {
        $principalId = $appentry.AppPrincipalId
    
        Get-MsolServicePrincipalCredential -AppPrincipalId $principalId -ReturnKeyValues $false | Where-Object { $_.Type -eq "Password" } | ForEach-Object {
            [PSCustomObject][Ordered]@{
                PrincipalName = $appentry.DisplayName
                PrincipalId = $principalId
                KeyID = $_.KeyId
                StartDate = $_.StartDate
                EndDate = $_.EndDate
            } | Export-Csv -Path C:\temp\appsec.csv -NoTypeInformation -Delimiter ';' -Append
        }
    }
    
  4. 打开文件C:\temp\appsec.csv以查看报表。 如果任意密码即将到期,在下一过程中使 Windows PowerShell 窗口保持打开状态。

生成新密码

  1. 使用以下命令行创建一个客户端 ID,并将 SharePoint 外接程序的客户端 ID 用作参数。

    $clientId = 'client id of the add-in'
    
  2. 使用以下命令行生成新的客户端密码:

    $bytes = New-Object Byte[] 32
    $rand = [System.Security.Cryptography.RandomNumberGenerator]::Create()
    $rand.GetBytes($bytes)
    $rand.Dispose()
    $newClientSecret = [System.Convert]::ToBase64String($bytes)
    $dtStart = [System.DateTime]::Now
    $dtEnd = $dtStart.AddYears(1)
    New-MsolServicePrincipalCredential -AppPrincipalId $clientId -Type Symmetric -Usage Sign -Value $newClientSecret -StartDate $dtStart -EndDate $dtEnd
    New-MsolServicePrincipalCredential -AppPrincipalId $clientId -Type Symmetric -Usage Verify -Value $newClientSecret -StartDate $dtStart -EndDate $dtEnd
    New-MsolServicePrincipalCredential -AppPrincipalId $clientId -Type Password -Usage Verify -Value $newClientSecret -StartDate $dtStart -EndDate $dtEnd
    $newClientSecret
    
  3. 新客户端密码会显示在 Windows PowerShell 控制台中。 将其复制到文本文件中。 在下一过程中使用它。

    提示

    默认情况下,加载项密码的有效期为一年。 可通过在三次调用 New-MsolServicePrincipalCredential cmdlet 时使用 -EndDate 参数将有效期设置为更短或更长。

在 Visual Studio 中更新远程 Web 应用程序,以使用新的密码

重要

如果最初是通过 Microsoft Visual Studio 的 Office 开发人员工具预发布版本创建的加载项,它可能包含过期版本的 TokenHelper.cs(或 .vb)文件。 如果文件不包含字符串“secondaryClientSecret”,则它已经过期,必须先进行更换,然后才能使用新密码更新 Web 应用程序。 要获取发布版本的文件副本,需要 Visual Studio 2012 或更高版本。 在 Visual Studio 中创建新的 SharePoint 加载项项目 将 TokenHelper 文件从 Visual Studio 复制到 SharePoint 加载项的 web 应用程序项目中。

  1. 在 Visual Studio 中打开 SharePoint 外接程序项目,并打开该 Web 应用程序项目的 web.config 文件。 在 appSettings 部分中,有一些针对客户端 ID 和客户端密码的密钥。 示例如下:

    <appSettings>
      <add key="ClientId" value="your client id here" />
      <add key="ClientSecret" value="your old secret here" />
        ... other settings may be here ...
    </appSettings>
    
  2. ClientSecret 密钥的名称改为 SecondaryClientSecret,示例如下:

    <add key="SecondaryClientSecret" value="your old secret here" />
    

    注意

    如果是首次执行此过程,此时配置文件中没有 SecondaryClientSecret 属性条目。 但是,如果执行的是后续客户端密码过期(第二个或第三个)过程,则属性 SecondaryClientSecret 已经存在,并包含初始或已过期的旧密码。 本例中,先删除 SecondaryClientSecret 属性,然后再重命名 ClientSecret

  3. 添加新的 ClientSecret 密钥,并提供新的客户端密码。 现在您的标记应如下所示:

    <appSettings>
      <add key="ClientId" value="your client id here" />
      <add key="ClientSecret" value="your new secret here" />
      <add key="SecondaryClientSecret" value="your old secret here" />
        ... other settings may be here ...
    </appSettings>
    

    重要

    只有在当前客户端密码到期后,才能使用新生成的客户端密码。 因此,如果没有 SecondaryClientSecret 键,便无法将 ClientId 键更改为新客户端密码。 必须按照本文中的过程操作,并等待以前的客户端密码过期。 然后,可以根据需要删除 Secondary ClientSecret。

  4. 如果已更改为新 TokenHelper 文件,请重新生成项目。

  5. 重新发布 Web 应用程序。

创建有效期为三年的客户端密码

对于已过期的客户端密码,首先必须删除给定 clientId 的所有过期密码。 然后通过 MSO PowerShell 创建一个新密码,并至少等待 24 小时,然后使用新的 clientIdClientSecret 密钥测试应用。

  1. 通过具有以下使用 SharePoint Windows PowerShell 的标记的租户管理员用户连接到 MSOnline。

    import-module MSOnline
    $msolcred = get-credential
    connect-msolservice -credential $msolcred
    
  2. 获取 ServicePrincipals 和密钥。 打印 $keys 可返回三个记录。 还会看到每个密钥的 EndDate。 确认你的过期密钥是否出现。

    注意

    clientId 需要与你的过期 clientId 相匹配。 建议删除此 clientId 的所有密钥(过期和未过期密钥)。

    $clientId = "27c5b286-62a6-45c7-beda-abbaea6eecf2"
    $keys = Get-MsolServicePrincipalCredential -AppPrincipalId $clientId
    $keys
    
  3. 确认所有密钥确实已过期后,请将其删除。

    Remove-MsolServicePrincipalCredential -KeyIds $keys.KeyId -AppPrincipalId $clientId
    
  4. 生成此 clientID 的新 ClientSecret。 它使用在上述步骤中设置的相同 clientId。 新的 ClientSecret 的有效期为 3 年。

    $bytes = New-Object Byte[] 32
    $rand = [System.Security.Cryptography.RandomNumberGenerator]::Create()
    $rand.GetBytes($bytes)
    $rand.Dispose()
    $newClientSecret = [System.Convert]::ToBase64String($bytes)
    $dtStart = [System.DateTime]::Now
    $dtEnd = $dtStart.AddYears(3)
    New-MsolServicePrincipalCredential -AppPrincipalId $clientId -Type Symmetric -Usage Sign -Value $newClientSecret -StartDate $dtStart  -EndDate $dtEnd
    New-MsolServicePrincipalCredential -AppPrincipalId $clientId -Type Symmetric -Usage Verify -Value $newClientSecret   -StartDate $dtStart  -EndDate $dtEnd
    New-MsolServicePrincipalCredential -AppPrincipalId $clientId -Type Password -Usage Verify -Value $newClientSecret   -StartDate $dtStart  -EndDate $dtEnd
    $newClientSecret
    
  5. 复制 $newClientSecret 的输出。

  6. 使用此 ClientIdClientSecret 替换 Web.config 。 您不需要 SecondaryClientSecret 应用设置。

  7. 等待至少 24 小时来将 ClientSecret 传播到 SharePoint Office (SPO)。

另请参阅