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