在哪个帐户下,Azure Function应用程序中托管的.net控制台应用程序将运行

joh*_* Gu 5 sharepoint azure office365 azure-functions

我开发了一个具有以下主要特征的.net控制台应用程序: -

  1. 与SharePoint联机REST API集成,检索某些列表项,以及修改项字段.
  2. 例如,每天早上1点运行.
  3. 我将在Azure Function应用程序中托管此控制台应用程序.
  4. Azure帐户对sharepoint租户没有任何权限,因为Azure帐户和联机sharepoint位于不同的域中.

所以我不确定控制台应用程序将在哪个帐户运行?

  • 它会在当前的Azure帐户下运行吗?如果是这种情况,那么这将不起作用,因为azure帐户在不同的域上,并且没有对sharepoint的任何权限(它不应该有)?

要么

  • 我可以定义Azure功能应用程序的服务帐户在其下运行,在这种情况下,我可以将服务帐户定义为在线sharepoint内的授权帐户?

要么

  • 我需要在控制台应用程序本身内定义用户名/密码?我不喜欢接近,因为我将在控制台应用程序中公开密码.同时更改用户名的密码意味着我们需要相应地更新控制台应用程序.

所以有人可以就此提出建议吗?谢谢

编辑

管理控制台应用程序身份验证的代码: -

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)

Roh*_*gal 5

你的问题有很多部分,所以我会相应地回答.

1.您提到的3中的哪个选项(或者如果有不同的更好的选项:)),您是否应该用来管理配置数据/服务帐户身份

选项4(类似于您的选项2,具有细微差别):您应该完全从控制台应用程序中获取服务帐户标识和配置数据,并通过Azure功能应用程序的"应用程序设置"传递它们.

此选项类似于您在问题中的选项2,因为您将信息保留在控制台应用程序代码之外

我可以定义Azure功能应用程序的服务帐户在其下运行,在这种情况下,我可以将服务帐户定义为在线sharepoint内的授权帐户?

但不同的是,我并不是说您将能够为您的Azure功能应用程序定义一个服务帐户来运行(因为您无法控制Azure功能将在其下运行的帐户,Microsoft基础设施负责),相反,您将把它作为安全配置数据传递给您的控制台应用程序,您的控制台应用程序将使用它.稍后在比较选项时更多关于安全性/加密.

我实际上从问题中获取了控制台应用程序代码,创建了一个控制台应用程序,并在计时器触发的Azure功能中使用它来使其正常工作 所以这些步骤来自一个工作样本.我在我的控制台应用程序中使用了"Microsoft.SharePointOnline.CSOM"nuget包,并且必须上传一些依赖dll和exe以便它运行.如果您遇到问题,请随时询问有关执行此部分的更多详细信息.

添加应用程序设置 - 导航Azure功能应用程序并单击"应用程序设置"

在此输入图像描述

为要从控制台应用程序中取出的所有项目添加设置,并从外部进行控制.我为我看到的所有3件物品都做了,但这取决于你.

在此输入图像描述

然后更改您的代码以使用这些设置.我在最后展示了确切的代码更改.

选项5 在Azure AD中注册新应用程序以表示Azure功能.

  • 您应该在Azure AD中注册新应用程序,并使用此标识在线访问SharePoint.
  • 您需要为此应用程序在线授予SharePoint权限(注意:权限分配不会像您的服务帐户方法那样详细或详细,我会在比较选项时解释更多)
  • 您需要将证书与AzureAD应用程序相关联,以帮助进行身份验证.
  • 在线验证SharePoint时,您无法像今天的代码那样直接使用SharePointOnlineCredentials类,而是在http请求的"Authorization"标头中发送持票令牌.

这是博客文章,介绍了此选项中涉及的详细步骤5.注意:此博客仍然在最后省略了功能代码中的密码等证书详细信息,这将不是理想的,您需要将其移出到应用程序设置理想情况下,或Azure Key Vault.

2.将运行.NET控制台应用程序的帐户以及所有选项的快速比较

这是一个任意的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,或两者的组合.

3.代码更改以使用应用程序设置

只是重要的变化

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)

执行Azure功能时输出 在此输入图像描述


归档时间:

查看次数:

264 次

最近记录:

7 年,5 月 前