替换 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 外接程序的到期日期
打开 Windows PowerShell 并运行以下 cmdlet:
Connect-MsolService
在登录提示符处,输入使用 AppRegNew.aspx 注册加载项的 Office 365 租赁或场的租户管理员(或场管理员)凭据。
生成一个报告,其中在下列行中列出每个外接程序及其密钥的到期日期。 对于此代码,请注意以下事项:
- 它首先筛选出 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 } }
打开文件C:\temp\appsec.csv以查看报表。 如果任意密码即将到期,在下一过程中使 Windows PowerShell 窗口保持打开状态。
生成新密码
使用以下命令行创建一个客户端 ID,并将 SharePoint 外接程序的客户端 ID 用作参数。
$clientId = 'client id of the add-in'
使用以下命令行生成新的客户端密码:
$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
新客户端密码会显示在 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 应用程序项目中。
在 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>
将 ClientSecret 密钥的名称改为
SecondaryClientSecret
,示例如下:<add key="SecondaryClientSecret" value="your old secret here" />
注意
如果是首次执行此过程,此时配置文件中没有 SecondaryClientSecret 属性条目。 但是,如果执行的是后续客户端密码过期(第二个或第三个)过程,则属性 SecondaryClientSecret 已经存在,并包含初始或已过期的旧密码。 本例中,先删除 SecondaryClientSecret 属性,然后再重命名 ClientSecret。
添加新的 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。
如果已更改为新 TokenHelper 文件,请重新生成项目。
重新发布 Web 应用程序。
创建有效期为三年的客户端密码
对于已过期的客户端密码,首先必须删除给定 clientId 的所有过期密码。 然后通过 MSO PowerShell 创建一个新密码,并至少等待 24 小时,然后使用新的 clientId 和 ClientSecret 密钥测试应用。
通过具有以下使用 SharePoint Windows PowerShell 的标记的租户管理员用户连接到 MSOnline。
import-module MSOnline $msolcred = get-credential connect-msolservice -credential $msolcred
获取 ServicePrincipals 和密钥。 打印 $keys 可返回三个记录。 还会看到每个密钥的 EndDate。 确认你的过期密钥是否出现。
注意
clientId 需要与你的过期 clientId 相匹配。 建议删除此 clientId 的所有密钥(过期和未过期密钥)。
$clientId = "27c5b286-62a6-45c7-beda-abbaea6eecf2" $keys = Get-MsolServicePrincipalCredential -AppPrincipalId $clientId $keys
确认所有密钥确实已过期后,请将其删除。
Remove-MsolServicePrincipalCredential -KeyIds $keys.KeyId -AppPrincipalId $clientId
生成此 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
复制 $newClientSecret 的输出。
使用此 ClientId 和 ClientSecret 替换 Web.config 。 您不需要 SecondaryClientSecret 应用设置。
等待至少 24 小时来将 ClientSecret 传播到 SharePoint Office (SPO)。