joh*_* Gu 5 sharepoint azure office365 azure-functions
我开发了一个具有以下主要特征的.net控制台应用程序: -
所以我不确定控制台应用程序将在哪个帐户运行?
要么
要么
所以有人可以就此提出建议吗?谢谢
编辑
管理控制台应用程序身份验证的代码: -
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint.Client;
namespace O365SPProject
{
class Program
{
private class Configuration
{
public static string ServiceSiteUrl = "https://<tenant>.sharepoint.com";
public static string ServiceUserName = "<user>@<tenant>.onmicrosoft.com";
public static string ServicePassword = "xxxxxxxxxx";
}
static ClientContext GetonlineContext()
{
var securePassword = new SecureString();
foreach (char c in Configuration.ServicePassword)
{
securePassword.AppendChar(c);
}
var onlineCredentials = new SharePointOnlineCredentials(Configuration.ServiceUserName, securePassword);
var context = new ClientContext(Configuration.ServiceSiteUrl);
context.Credentials = onlineCredentials;
return context;
}
static void Main(string[] args)
{
var ClientContext=GetonlineContext();
Web web = clientContext.Web;
// do somethings
}
}
}
Run Code Online (Sandbox Code Playgroud)
你的问题有很多部分,所以我会相应地回答.
选项4(类似于您的选项2,具有细微差别):您应该完全从控制台应用程序中获取服务帐户标识和配置数据,并通过Azure功能应用程序的"应用程序设置"传递它们.
此选项类似于您在问题中的选项2,因为您将信息保留在控制台应用程序代码之外
我可以定义Azure功能应用程序的服务帐户在其下运行,在这种情况下,我可以将服务帐户定义为在线sharepoint内的授权帐户?
但不同的是,我并不是说您将能够为您的Azure功能应用程序定义一个服务帐户来运行(因为您无法控制Azure功能将在其下运行的帐户,Microsoft基础设施负责),相反,您将把它作为安全配置数据传递给您的控制台应用程序,您的控制台应用程序将使用它.稍后在比较选项时更多关于安全性/加密.
我实际上从问题中获取了控制台应用程序代码,创建了一个控制台应用程序,并在计时器触发的Azure功能中使用它来使其正常工作 所以这些步骤来自一个工作样本.我在我的控制台应用程序中使用了"Microsoft.SharePointOnline.CSOM"nuget包,并且必须上传一些依赖dll和exe以便它运行.如果您遇到问题,请随时询问有关执行此部分的更多详细信息.
添加应用程序设置 - 导航Azure功能应用程序并单击"应用程序设置"
为要从控制台应用程序中取出的所有项目添加设置,并从外部进行控制.我为我看到的所有3件物品都做了,但这取决于你.
然后更改您的代码以使用这些设置.我在最后展示了确切的代码更改.
选项5 在Azure AD中注册新应用程序以表示Azure功能.
这是博客文章,介绍了此选项中涉及的详细步骤5.注意:此博客仍然在最后省略了功能代码中的密码等证书详细信息,这将不是理想的,您需要将其移出到应用程序设置理想情况下,或Azure Key Vault.
这是一个任意的IIS应用程序池帐户,正如@Mitch Stewart指出的那样,其他SO帖子在我为我的功能获得的输出中很明显,它在我的运行中的确切价值出来是"IIS APPPOOL\mawsFnPlaceholder0_v1".请参见底部的图像.你已经分享了一些很好的信息,所以我不再重复了.我唯一要补充的是,这个帐户将由托管您的功能应用程序的基础架构控制,并且将更多地用于处理许多功能应用程序可以运行的共享基础架构中的隔离/其他问题,因此尝试控制/更改它可能不是现在的方式.
选项1(来自您的问题) - 为您的SharePoint Online站点授予IIS应用程序池帐户权限,尤其是当您不控制帐户时,这可能不是一个好主意.
选项2(来自您的问题) - 它会比您提到的其他2个选项更好,但您无法真正控制此帐户.
选项3(来自您的问题) - 将此信息深入嵌入您的控制台应用程序将是一个维护问题,而不是最安全的选项,除非您开始阅读保险库等.无论您做什么,维护问题都将保留,因为它是嵌入的在编译的代码中,它不应该是.
选项4 - 这比之前的3个选项更好,因为它将代码的关注与配置和身份信息分开,不需要重新编译进行更新.另请注意,默认情况下,您在App Settings配置中存储的内容都是加密的(具有良好的密钥轮换管理),这是推荐的方式.这些值仅在执行应用程序之前解密并加载到进程内存中.请看这个链接中的详细讨论,我还在下面给出了一个小的相关摘录 -
即使使用此选项,您也可以将它们存储在密钥保管库中,然后您的设置将是具有实际信息的密钥保管库密钥的URL.
选项5 - 此选项使用基于Azure AD的身份对SharePoint Online进行身份验证,这是很好的部分.它确实带来了一些额外的努力和一些限制,因此您需要考虑这些限制在您的场景中是否可接受:
SharePoint联机的权限不会像用户从SharePoint用户/组界面内部获得权限那样详细/详细(没有站点/列表/文件夹/项级别特定权限等).在此方法中,您将在设置Azure AD应用程序时提供权限,您将只获得这些通用选项(如下面的屏幕截图所示)

Microsoft在此方案中有一些记录良好的限制,您可以在此处阅读:使用仅限app时有哪些限制

总的来说,我建议您根据场景中可接受的限制选择选项4或选项5,或两者的组合.
只是重要的变化
public static string ServiceSiteUrl = Environment.GetEnvironmentVariable("ServiceSiteUrl");
public static string ServiceUserName = Environment.GetEnvironmentVariable("ServiceUserName");
public static string ServicePassword = Environment.GetEnvironmentVariable("ServicePassword");
Run Code Online (Sandbox Code Playgroud)
工作示例中的完整代码(我替换了读取标题和Url for SharePoint Web对象):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.SharePoint.Client;
using System.Security;
using System.Security.Principal;
namespace O365SPProject
{
class Program
{
private class Configuration
{
public static string ServiceSiteUrl = Environment.GetEnvironmentVariable("ServiceSiteUrl");
public static string ServiceUserName = Environment.GetEnvironmentVariable("ServiceUserName");
public static string ServicePassword = Environment.GetEnvironmentVariable("ServicePassword");
}
static ClientContext GetonlineContext()
{
var securePassword = new SecureString();
foreach (char c in Configuration.ServicePassword)
{
securePassword.AppendChar(c);
}
var onlineCredentials = new SharePointOnlineCredentials(Configuration.ServiceUserName, securePassword);
var context = new ClientContext(Configuration.ServiceSiteUrl);
context.Credentials = onlineCredentials;
return context;
}
static void Main(string[] args)
{
var ClientContext = GetonlineContext();
ClientContext.Load(ClientContext.Web);
ClientContext.ExecuteQuery();
Console.WriteLine("This app found web title as: {0} and URL as: {1}",
ClientContext.Web.Title, ClientContext.Web.Url);
Console.WriteLine("Console app is running with identity {0}", WindowsIdentity.GetCurrent().Name);
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
264 次 |
| 最近记录: |