如果我们将“DisableCustomAppAuthentication”设置为 true,如何针对 SharePoint 在线验证我们的 .NET 控制台应用程序
How to authenticate our .NET console application against SharePoint online if we have `DisableCustomAppAuthentication` set to true
我们有以下内容:-
- 最近创建了 SharePoint 在线租户
- Windows 服务器 2019
- .NET 控制台应用程序,其中包含一些与 SharePoint 在线集成的代码
- .NET 控制台应用程序使用 windows 任务计划程序按计划运行。
现在以前在旧租户上我使用此方法通过传递 ClientID 和 Client Secret 来验证我的代码:-
static void Main(string[] args)
{
string siteUrl = "https://***.sharepoint.com/sites/CustomerServiceKB/";
string clientId = "******";
string clientSecret = "*****";
using (ClientContext context = new OfficeDevPnP.Core.AuthenticationManager().GetAppOnlyAuthenticatedContext(siteUrl, clientId, clientSecret))
{
但是在我们新创建的租户上,我们无法使用上述方法验证我们的代码,因为我们将 DisableCustomAppAuthentication
设置为 true.. 现在我们不想修改此 属性。
所以我们的问题是;如果我们将 DisableCustomAppAuthentication
设置为 true(我们不想将其设置为 false),那么我们如何验证我们的控制台应用程序?它托管在我们的 windows 服务器内,并使用任务调度程序按计划运行?
因此 DisableCustomAppAuthentication
属性 被引入(默认设置为 true
)以支持 Azure 访问控制服务 (ACS) 的 deprecation .在 Sharepoint 租户中验证自定义应用程序的现代方法是在 Azure AD 中注册它们。
在继续之前,请考虑切换到新身份验证方案的利弊。主要是,ACS 使用户能够精细地控制应用程序身份验证的站点级权限,但 Azure AD 应用程序注册使 运行ning 应用程序集对管理员透明。如果您想继续使用 ACS,只需将 DisableCustomAppAuthentication
设置为 false
。
现在,如果您决定继续在 Azure ID 中注册应用程序,请遵循以下步骤:
登录到 Azure 门户并导航到 Azure Active Directory。
在 Azure AD 门户中注册应用程序。 guide 介绍了如何操作。在应用程序概览页面获取应用程序(客户端)ID。
设置所有必要的权限,confirm them作为全局管理员(或请管理员确认)。
Configure 认证。选择身份验证选项:您是否希望应用程序通过加密证书或客户端机密在 Microsoft IAM 中对自身进行身份验证。
获取您的 Azure Active Directory 租户 ID(不要与 Sharepoint Online 租户 ID 混淆)。这里是 how to do in in the Azure AD; there's also a hacky way.
现在使用客户端 ID(来自第 2 步)、身份验证选项(第 4 步)和 AAD 租户 ID(第 5 步)来验证和 运行 您的应用程序:
using Microsoft.Identity.Client;
[..]
private static async Task<string> GetToken()
{
string applicationId = "client-id";
string tenantId = "aad-tenant-id";
bool isUsingClientSecret = <true or false>;
IConfidentialClientApplication app;
if (isUsingClientSecret)
{
string secret = "secret";
app = ConfidentialClientApplicationBuilder.Create(applicationId)
.WithClientSecret(secret)
.WithAuthority($"https://login.microsoftonline.com/{tenantId}")
.Build();
}
else
{
string certificateLocation = "certificate-file";
X509Certificate2 certificate = ReadCertificate(certificateLocation);
app = ConfidentialClientApplicationBuilder.Create(applicationId)
.WithCertificate(certificate)
.WithAuthority($"https://login.microsoftonline.com/{tenantId}")
.Build();
}
var scopes = new[] { "https://***.sharepoint.com/.default" };
var authenticationResult = await app.AcquireTokenForClient(scopes).ExecuteAsync();
return authenticationResult.AccessToken;
}
static async Task MainAsync(string[] args)
{
string site = "https://***.sharepoint.com/sites/CustomerServiceKB";
string token = await GetToken();
using (ClientContext context = new ClientContext(site))
{
context.ExecutingWebRequest += (s, e) =>
{
e.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer " + token;
};
Web web = context.Web;
context.Load(web);
context.ExecuteQuery();
}
}
static void Main(string[] args)
{
try
{
AsyncContext.Run(() => MainAsync(args));
}
catch (Exception ex)
{
Console.Error.WriteLine(ex);
throw;
}
}
我们有以下内容:-
- 最近创建了 SharePoint 在线租户
- Windows 服务器 2019
- .NET 控制台应用程序,其中包含一些与 SharePoint 在线集成的代码
- .NET 控制台应用程序使用 windows 任务计划程序按计划运行。
现在以前在旧租户上我使用此方法通过传递 ClientID 和 Client Secret 来验证我的代码:-
static void Main(string[] args)
{
string siteUrl = "https://***.sharepoint.com/sites/CustomerServiceKB/";
string clientId = "******";
string clientSecret = "*****";
using (ClientContext context = new OfficeDevPnP.Core.AuthenticationManager().GetAppOnlyAuthenticatedContext(siteUrl, clientId, clientSecret))
{
但是在我们新创建的租户上,我们无法使用上述方法验证我们的代码,因为我们将 DisableCustomAppAuthentication
设置为 true.. 现在我们不想修改此 属性。
所以我们的问题是;如果我们将 DisableCustomAppAuthentication
设置为 true(我们不想将其设置为 false),那么我们如何验证我们的控制台应用程序?它托管在我们的 windows 服务器内,并使用任务调度程序按计划运行?
因此 DisableCustomAppAuthentication
属性 被引入(默认设置为 true
)以支持 Azure 访问控制服务 (ACS) 的 deprecation .在 Sharepoint 租户中验证自定义应用程序的现代方法是在 Azure AD 中注册它们。
在继续之前,请考虑切换到新身份验证方案的利弊。主要是,ACS 使用户能够精细地控制应用程序身份验证的站点级权限,但 Azure AD 应用程序注册使 运行ning 应用程序集对管理员透明。如果您想继续使用 ACS,只需将 DisableCustomAppAuthentication
设置为 false
。
现在,如果您决定继续在 Azure ID 中注册应用程序,请遵循以下步骤:
登录到 Azure 门户并导航到 Azure Active Directory。
在 Azure AD 门户中注册应用程序。 guide 介绍了如何操作。在应用程序概览页面获取应用程序(客户端)ID。
设置所有必要的权限,confirm them作为全局管理员(或请管理员确认)。
Configure 认证。选择身份验证选项:您是否希望应用程序通过加密证书或客户端机密在 Microsoft IAM 中对自身进行身份验证。
获取您的 Azure Active Directory 租户 ID(不要与 Sharepoint Online 租户 ID 混淆)。这里是 how to do in in the Azure AD; there's also a hacky way.
现在使用客户端 ID(来自第 2 步)、身份验证选项(第 4 步)和 AAD 租户 ID(第 5 步)来验证和 运行 您的应用程序:
using Microsoft.Identity.Client; [..] private static async Task<string> GetToken() { string applicationId = "client-id"; string tenantId = "aad-tenant-id"; bool isUsingClientSecret = <true or false>; IConfidentialClientApplication app; if (isUsingClientSecret) { string secret = "secret"; app = ConfidentialClientApplicationBuilder.Create(applicationId) .WithClientSecret(secret) .WithAuthority($"https://login.microsoftonline.com/{tenantId}") .Build(); } else { string certificateLocation = "certificate-file"; X509Certificate2 certificate = ReadCertificate(certificateLocation); app = ConfidentialClientApplicationBuilder.Create(applicationId) .WithCertificate(certificate) .WithAuthority($"https://login.microsoftonline.com/{tenantId}") .Build(); } var scopes = new[] { "https://***.sharepoint.com/.default" }; var authenticationResult = await app.AcquireTokenForClient(scopes).ExecuteAsync(); return authenticationResult.AccessToken; } static async Task MainAsync(string[] args) { string site = "https://***.sharepoint.com/sites/CustomerServiceKB"; string token = await GetToken(); using (ClientContext context = new ClientContext(site)) { context.ExecutingWebRequest += (s, e) => { e.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer " + token; }; Web web = context.Web; context.Load(web); context.ExecuteQuery(); } } static void Main(string[] args) { try { AsyncContext.Run(() => MainAsync(args)); } catch (Exception ex) { Console.Error.WriteLine(ex); throw; } }