У меня есть приведенное ниже консольное приложение, которое интегрируется с SharePoint Online. консольное приложение размещается на локальной виртуальной машине и проходит проверку подлинности в SharePoint с использованием ClientId, TenantID и сертификата, как показано ниже:
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using PnP.Core.Auth;
using PnP.Core.Model.SharePoint;
using PnP.Core.Model.Teams;
using PnP.Core.QueryModel;
using PnP.Core.Services;
using PnP.Core.Services.Builder.Configuration;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Globalization;
using System.Runtime.CompilerServices;
using System.Security.Cryptography.X509Certificates;
using static Microsoft.ApplicationInsights.MetricDimensionNames.TelemetryContext;
using static System.Net.Mime.MediaTypeNames;
namespace ConsoleApp4
{
internal class Program
{
static async Task Main(string[] args)
{
var tenantId = "b***c";
var clientId = "7*****9";
var certificatePath = @"c:\CERT\SPDashBoardIntegration.pfx";
var certificatePassword = "***";
// Initialize a new service collection
var serviceCollection = new ServiceCollection();
// Load the certificate
var certificate = new X509Certificate2(certificatePath, certificatePassword, X509KeyStorageFlags.Exportable);
// Configure logging
serviceCollection.AddLogging(builder =>
{
builder.AddConsole();
});
// Add and configure PnP Core SDK
serviceCollection.AddPnPCore(options =>
{
options.PnPContext.GraphFirst = true; // Set true if you prefer to use Graph over CSOM when possible
// options.HttpRequests.UserAgent = "ISV|Contoso|ProductX";
options.Sites.Add("SiteToWorkWith", new PnPCoreSiteOptions
{
SiteUrl = "https://********.sharepoint.com/sites/********-******",
AuthenticationProvider = new X509CertificateAuthenticationProvider(clientId, tenantId, certificate)
});
});
int i = 0;
// Build the service provider
var serviceProvider = serviceCollection.BuildServiceProvider();
// Use the service provider to get the IPnPContextFactory instance
var pnpContextFactory = serviceProvider.GetRequiredService<IPnPContextFactory>();
// Now you can use the IPnPContextFactory to get a PnPContext and perform operations
var context = await pnpContextFactory.CreateAsync("SiteToWorkWith");
// Assume the fields where not yet loaded, so loading them with the list
var workOrderList = context.Web.Lists.GetByTitle("Work Orders", p => p.Title,
p => p.Fields.QueryProperties(p => p.InternalName,
p => p.FieldTypeKind,
p => p.TypeAsString,
p => p.Title));
Теперь мой вопрос: является ли это безопасным подходом? Я имею в виду, когда виртуальная машина отправляет ClientID, секрет клиента и сертификат в SharePoint Online, будет ли эта информация в безопасности в сети? я имею в виду, будет ли консольное приложение безопасно взаимодействовать с SharePoint при отправке учетных данных (ClientID, секрет клиента и сертификат)? Если нет, то как мы можем это обеспечить?
Спасибо





Предоставленный код можно улучшить с точки зрения безопасности, используя управляемое удостоверение Azure Active Directory (AAD) для виртуальной машины вместо хранения учетных данных сертификата непосредственно в коде. Вот как можно изменить код:
Удалите строки, определяющие tenantId, clientId, certificatePath и certificatePassword.
Включите управляемое удостоверение для локальной виртуальной машины, следуя инструкциям Microsoft https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview. Назначьте необходимые разрешения (например, Sites.Manage.All) управляемому удостоверению при регистрации приложения Azure AD для доступа к SharePoint Online. 3. Обновите конфигурацию ядра PnP:
Измените раздел serviceCollection.AddPnPCore, чтобы использовать AzureADAuthenticationProvider вместо X509CertificateAuthenticationProvider.
это то, что я предполагаю. хотя может быть и не так
@SigarDave да, виртуальная машина размещается локально... так будет ли безопасна связь между виртуальной машиной (консольным приложением) и онлайн-API SharePoint? будут ли секрет клиента, идентификатор клиента и сертификат зашифрованы в сети?
@YehorAndrosov спасибо за ответ. да, виртуальная машина размещается локально, а не в Azure... так безопасен ли мой подход в отношении шифрования данных, когда они отправляются из консольного приложения в SharePoint онлайн?
@SigarDave спасибо за ваш совет, но я спрашиваю о моем нынешнем подходе: будет ли информация, в основном идентификатор клиента, идентификатор клиента, пароль сертификата, зашифрована, когда они будут отправлены в SharePoint Online API?
Нет, clientID, tenantID и пароль сертификата не шифруются при прямой отправке в SharePoint Online API с локальной виртуальной машины.
TLS используется для шифрования данных при передаче. Многие службы Azure начали отказываться от поддержки TLS 1.0 и 1.1 в пользу TLS 1.2+. Вызов этих служб выдаст сообщение «Запрос был прерван: не удалось создать безопасный канал SSL/TLS», если ваше приложение и виртуальная машина неправильно настроены для безопасных соединений.
Подготовка к TLS 1.2 в Office 365
Я думаю, вам нужно больше сосредоточиться на установке обновлений безопасности на вашей виртуальной машине и сохранении в секрете учетных данных, которые вы используете для подключения к вашей виртуальной машине. Благодаря этим подходам ваши учетные данные Sharepoint находятся в достаточной безопасности.
спасибо за ответ, во время тестирования приложения я могу без проблем запустить его в Visual Studio на своем ноутбуке с Windows 10.. так что я думаю, что на виртуальной машине все должно быть хорошо
в вопросе не говорится, что виртуальная машина размещена в Azure