Authentication Azure功能应用程序使用CSOM和Azure AD进行身份验证

Authentication Azure功能应用程序使用CSOM和Azure AD进行身份验证,authentication,azure-active-directory,azure-functions,csom,Authentication,Azure Active Directory,Azure Functions,Csom,我不确定这是否可行,但我的目标是一个可以使用SharePoint CSOM的Azure function应用程序。我一直在思考如何在没有用户凭据的情况下进行授权。我拼凑了下面的代码,但它抛出了一个错误。这可能是我在执行JavaScript应用程序和Web Api时遇到的配置问题。但我也想知道这是否可行,或者我是否走错了方向。代码之前的一些关键点: 我的前端演示应用程序是用一个用于身份验证的秘密创建的 我的Api演示应用被授予Azure AD、Microsoft Graph和SharePoint的

我不确定这是否可行,但我的目标是一个可以使用SharePoint CSOM的Azure function应用程序。我一直在思考如何在没有用户凭据的情况下进行授权。我拼凑了下面的代码,但它抛出了一个错误。这可能是我在执行JavaScript应用程序和Web Api时遇到的配置问题。但我也想知道这是否可行,或者我是否走错了方向。代码之前的一些关键点:

  • 我的前端演示应用程序是用一个用于身份验证的秘密创建的
  • 我的Api演示应用被授予Azure AD、Microsoft Graph和SharePoint的Api权限
  • 我的Api演示应用程序公开了一个Api,前端演示应用程序作为授权客户端应用程序添加
  • private静态异步任务ProcessMessageAsync(字符串myQueueItem,ILogger日志)
    {
    常量字符串mName=“ProcessMessageAsync()”;
    字符串资源=”https://my-Portal.onmicrosoft.com/demoapp-api“;//具有sharepoint权限的demoapp api
    字符串clientId=“demoapp前端的guid”;//demoapp前端
    字符串clientSecret=“来自demoapp前端的秘密”;//demoapp前端秘密
    字符串siteUrl=”https://my-portal.sharepoint.com/sites/my-site“;//sharepoint网站
    字符串authorityUri=”https://login.microsoftonline.com/my-portal.onmicrosoft.com";
    尝试
    {
    使用(ClientContext ctx=await GetClientContext(authorityUri、siteUrl、resource、clientId、clientSecret))
    {
    Web=ctx.Web;
    ctx.Load(web);
    ctx.ExecuteQuery();
    log.LogInformation($“找到的站点:{web.Title}”);
    }
    }
    捕获(例外情况除外){
    WriteLine(“{0}***:{1}”中的***意外异常,mName,ex.Message);
    log.LogInformation(“{0}***:{1}”中的***意外异常,mName,ex.Message);
    while(例如InnerException!=null)
    {
    ex=ex.InnerException;
    控制台写入线(例如消息);
    }
    }
    }
    公共异步静态任务GetClientContext(字符串authorityuri、字符串siteUrl、字符串资源、字符串clientId、字符串clientSecret)
    {
    AuthenticationContext authContext=新的AuthenticationContext(authorityuri);
    AuthenticationResult ar=await GetAccessToken(authorityuri、resource、clientId、clientSecret);
    字符串令牌=ar.AccessToken;
    var ctx=新的ClientContext(siteUrl);
    ctx.ExecutingWebRequest+=(s,e)=>
    {
    e、 WebRequestExecutor.RequestHeaders[“授权”]=“承载人”+ar.AccessToken;
    };
    返回ctx;
    }
    静态异步任务GetAccessToken(字符串权限、字符串资源、字符串clientId、字符串clientSecret)
    {
    var clientCredential=新的clientCredential(clientId,clientSecret);
    AuthenticationContext=新的AuthenticationContext(authority,false);
    AuthenticationResult AuthenticationResult=等待上下文。AcquireTokenAsync(
    resource,//我们将使用令牌访问的资源(应用程序)
    clientCredential);//客户端凭据
    返回authenticationResult;
    }
    
    更新
    经过进一步研究,我认为问题可能是我使用了委托权限,而我需要应用程序权限(这要求我在目录中具有管理员访问权限)

    您将获得具有以下代码的令牌:

        AuthenticationResult ar = await GetAccessToken(authorityuri, resource, clientId, clientSecret);
        string token = ar.AccessToken;
    
    但是,您获得的令牌只能用于访问指定为参数的资源。在您的情况下,它是
    ”https://my-Portal.onmicrosoft.com/demoapp-api“


    因此,您只能使用该令牌访问端点web API,而不能直接访问sharepoint

    我确实有几篇文章声称这是可能的。例如[link]和[link]检查了这两篇文章。事实上,他们只有一个azure function应用程序,没有其他端点。并将其资源指定为其sharepoint网站。因此,他们将获得访问sharepoint网站的正确令牌。但你的情况与他们不同。我一直在试验代码,以便更紧密地匹配这些链接,我认为问题在于你需要授予函数应用程序非委托权限,这要求你是目录的管理员(而我不是管理员)。
        AuthenticationResult ar = await GetAccessToken(authorityuri, resource, clientId, clientSecret);
        string token = ar.AccessToken;