代码之家  ›  专栏  ›  技术社区  ›  john Gu

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

  •  5
  • john Gu  · 技术社区  · 6 年前

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

    1. 与SharePoint online REST API集成,以检索某些列表项,并修改“项”字段。
    2. 我将在Azure Function应用程序中托管此控制台应用程序。

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

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

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

    或者

    有人能给我一些建议吗? 谢谢

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

    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            
    
            } 
    
        } 
    
    }
    
    2 回复  |  直到 6 年前
        1
  •  5
  •   Rohit Saigal    6 年前

    1在您提到的3个选项中,您应该使用哪个选项(或者如果有其他更好的选项:)来管理配置数据/服务帐户标识

    方案4 (与选项2类似,但有细微差别): 您应该将服务帐户标识和配置数据完全从控制台应用程序中取出,并通过Azure功能应用程序的“应用程序设置”将它们传入。

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

    在这里,我可以将服务帐户定义为 sharepoint online内部的授权帐户?

    但不同的是,我并不是说你将能够为你的Azure函数应用程序定义一个服务帐户来运行(因为你不能控制Azure函数将在哪个帐户下运行,微软的基础设施会处理它),相反,您将把它作为安全配置数据传递给您的控制台应用程序,并且您的控制台应用程序将使用它。稍后将在比较选项时详细介绍安全性/加密。

    实际上,我从问题中提取了你的控制台应用程序代码,创建了一个控制台应用程序,并在一个计时器触发的Azure函数中使用它来让它工作。所以这些步骤来自一个工作样本。我用的是“Microsoft.SharePointOnline.CSOM“我的控制台应用程序中的nuget包,并且必须将一些依赖项dll与exe一起上载才能运行。如果您遇到问题,请随时询问有关执行此部分的更多详细信息。

    enter image description here

    为要从控制台应用程序中取出并从外部控制的所有项目添加设置。我看到的3个项目都是我做的,但这取决于你。

    enter image description here

    然后更改代码以使用这些设置。我已经显示了在最后的确切代码更改。

    方案5 在Azure AD中注册新应用程序以表示您的Azure功能。

    • 在对SharePoint online进行身份验证时,您将无法直接使用代码中的SharePointOnlineCredentials类,而是在http请求的“Authorization”标头中发送承载令牌。

    这里是 blog post 这将详细介绍选项5中涉及的步骤。 注意:这个博客仍然遗漏了证书的细节,如密码在最后的功能代码,这将是不理想的,你需要把它移到应用程序设置或Azure密钥库理想。

    它是一个任意的IIS应用程序池帐户,正如@Mitch Stewart,other SO posts所指出的,在我得到的函数输出中很明显,它在我运行时的确切值是“IIS应用程序池\mawsfnpocholder0\u v1”。请参见底部的图像。你已经分享了一些很好的信息,所以我不重复了。我唯一要补充的是,这个帐户将由托管你的功能应用程序的基础设施控制,并且将更多地设计为在一个共享的基础设施中处理隔离/其他问题,在这个基础设施中,许多功能应用程序可以运行,所以试图控制/更改它可能不是现在的方式。

    选项2(从你的问题)-它会比你提到的其他2个选项好,但你不能真正控制这个帐户。

    选项3(从您的问题)-将此信息深入到控制台应用程序将是一个维护问题,也不是最安全的选项,除非您开始从vault等读取。无论您做什么,维护问题都将保留,因为它嵌入到编译代码中,而这不应该是。

    选项4—这比前面的3个选项要好,因为它将代码与配置和标识信息分离开来,不需要重新编译更新。还要注意的是,无论您存储在应用程序设置配置默认加密(与良好的关键轮换治理),这是推荐的方式。这些值仅在应用程序执行之前解密并加载到进程内存中。在这个链接里看详细的讨论,下面我也给出了一个相关的小摘录-

    Provide documentation about encrypt/decrypt settings

    enter image description here

    不过,它确实需要一些额外的努力和一些限制,因此您需要考虑这些限制在您的场景中是否可以接受:

    三。代码更改以使用应用程序设置

    只是重要的改变

    public static string ServiceSiteUrl = Environment.GetEnvironmentVariable("ServiceSiteUrl");
    public static string ServiceUserName = Environment.GetEnvironmentVariable("ServiceUserName");
    public static string ServicePassword = Environment.GetEnvironmentVariable("ServicePassword");
    

    工作示例中的完整代码(我用读取SharePoint Web对象的标题和Url替换了Dosomething):

    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);
            }
        }
    }
    

    执行Azure函数时的输出 enter image description here

        2
  •  3
  •   Mitch Stewart    6 年前

    sharepointrestapi支持OAuth。这是一个很有前途的计划 article . 不过,这对你来说可能有点过分。或者,您可以尝试使用 basic auth

    编辑 当前用户 Azure函数的名称是IIS应用程序池的标识。

    Code Logs