Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure Sharepoint API无头获取访问令牌_Azure_Sharepoint_Oauth_Sharepoint Online - Fatal编程技术网

Azure Sharepoint API无头获取访问令牌

Azure Sharepoint API无头获取访问令牌,azure,sharepoint,oauth,sharepoint-online,Azure,Sharepoint,Oauth,Sharepoint Online,我正在编写一个必须调用Sharepoint online API的集成。我的集成不是一个webapp,必须在没有用户在场的情况下工作 据我所知,我需要两个设置步骤: 1.用户必须登录Azure并设置应用程序并获取客户端ID。 2.我必须使用客户端ID、用户名和密码调用服务,然后我将获得访问令牌、刷新令牌和ID令牌 一旦这两个设置步骤完成,我就可以使用访问令牌调用服务,但有时这会过期,我需要使用刷新令牌来获取一个新的令牌 第二步对我来说很奇怪。为什么没有一个用户界面,用户可以登录并获取访问刷新和I

我正在编写一个必须调用Sharepoint online API的集成。我的集成不是一个webapp,必须在没有用户在场的情况下工作

据我所知,我需要两个设置步骤: 1.用户必须登录Azure并设置应用程序并获取客户端ID。 2.我必须使用客户端ID、用户名和密码调用服务,然后我将获得访问令牌、刷新令牌和ID令牌

一旦这两个设置步骤完成,我就可以使用访问令牌调用服务,但有时这会过期,我需要使用刷新令牌来获取一个新的令牌

第二步对我来说很奇怪。为什么没有一个用户界面,用户可以登录并获取访问刷新和ID令牌?是否有人建立了一个实用的网站,只是这样做,还是我误解了什么

谢谢
Robert

对于服务和守护进程应用程序建议的OAuth流是客户端凭据流(在该流程中,不涉及刷新令牌;客户端ID和客户端密码用于获取最终过期的访问令牌,然后您需要使用相同的客户端ID和密码获取新的访问令牌)。在SharePoint Online的情况下,此场景有两个选项:

  • SharePoint Online+Azure访问控制服务(ACS)集成。详细信息。简言之,您可以创建一个服务主体(),例如在网站集级别-按照“创建AppPrincipal”操作我为此链接的博客中的部分。然后,你需要在应用程序清单中分配你的应用程序将需要的特定权限。请参阅“授予应用程序主体权限”部分中的示例-同样,你应该首先定义。然后,你可以从控制台应用程序使用服务主体:
Program.cs

            static void Main(string[] args)
        {
            Uri siteUri = new Uri("https://tenant.sharepoint.com/teams/test");
            //Get the realm for the URL
            string realm = TokenHelper.GetRealmFromTargetUrl(siteUri);

            //Get the access token for the URL.  
            //   Requires this app to be registered with the tenant
            string accessToken = TokenHelper.GetAppOnlyAccessToken(
                TokenHelper.SharePointPrincipal,
                siteUri.Authority, realm).AccessToken;

            HttpWebRequest endpointRequest =
(HttpWebRequest)HttpWebRequest.Create(
"https://tenant.sharepoint.com/teams/test/_api/web/lists/GetByTitle('Documents')/items");
            endpointRequest.Method = "GET";
            endpointRequest.Accept = "application/json;odata=verbose";

            endpointRequest.Headers.Add("Authorization", "Bearer " + accessToken);
            HttpWebResponse endpointResponse =
            (HttpWebResponse)endpointRequest.GetResponse();


        }
    }
app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
  <appSettings>
    <add key="ClientId" value="65e674ca-3827-4134-852b-1196ff935e08"/>
    <add key="ClientSecret" value="xxxxxxx"/>
  </appSettings>
</configuration>

。在该链接中,您将找到一个示例代码。第一种方法的区别在于,在这一种方法中,您使用的不是ACS而是AAD。应用程序所需的权限是在AAD中定义的-据我所知,到目前为止,您可以在AAD中定义的应用程序权限没有您可以通过ACS定义的权限那么精细-例如,使用ACS,您可以在网站集级别定义应用程序;使用AAD,您不能定义应用程序。应用程序将具有租户范围的权限(即所有网站集)

对于服务和守护进程应用程序建议的OAuth流是客户端凭据流(在该流程中,不涉及刷新令牌;客户端ID和客户端密码用于获取最终过期的访问令牌,然后您需要使用相同的客户端ID和密码获取新的访问令牌)。在SharePoint Online的情况下,此场景有两个选项:

  • SharePoint Online+Azure访问控制服务(ACS)集成。详细信息。简言之,您可以创建一个服务主体(),例如在网站集级别-按照“创建AppPrincipal”操作我为此链接的博客中的部分。然后,你需要在应用程序清单中分配你的应用程序将需要的特定权限。请参阅“授予应用程序主体权限”部分中的示例-同样,你应该首先定义。然后,你可以从控制台应用程序使用服务主体:
Program.cs

            static void Main(string[] args)
        {
            Uri siteUri = new Uri("https://tenant.sharepoint.com/teams/test");
            //Get the realm for the URL
            string realm = TokenHelper.GetRealmFromTargetUrl(siteUri);

            //Get the access token for the URL.  
            //   Requires this app to be registered with the tenant
            string accessToken = TokenHelper.GetAppOnlyAccessToken(
                TokenHelper.SharePointPrincipal,
                siteUri.Authority, realm).AccessToken;

            HttpWebRequest endpointRequest =
(HttpWebRequest)HttpWebRequest.Create(
"https://tenant.sharepoint.com/teams/test/_api/web/lists/GetByTitle('Documents')/items");
            endpointRequest.Method = "GET";
            endpointRequest.Accept = "application/json;odata=verbose";

            endpointRequest.Headers.Add("Authorization", "Bearer " + accessToken);
            HttpWebResponse endpointResponse =
            (HttpWebResponse)endpointRequest.GetResponse();


        }
    }
app.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
  <appSettings>
    <add key="ClientId" value="65e674ca-3827-4134-852b-1196ff935e08"/>
    <add key="ClientSecret" value="xxxxxxx"/>
  </appSettings>
</configuration>

。在该链接中,您将找到一个示例代码。第一种方法的区别在于,在这一种方法中,您使用的不是ACS而是AAD。应用程序所需的权限是在AAD中定义的-据我所知,到目前为止,您可以在AAD中定义的应用程序权限没有您可以通过ACS定义的权限那么精细-例如,使用ACS,您可以在网站集级别定义应用程序;使用AAD,您不能定义应用程序。应用程序将具有租户范围的权限(即所有网站集)

这可能会有所帮助。您所指的文章提到了一种称为应用程序清单的东西。我不是在编写Sharepoint应用程序,而是在我们的集成服务器上运行,因此清单部分让我感到困惑。我只是在我的文章中添加了更多信息,希望能有所帮助。这可能会有所帮助。您所指的文章如此我调用了应用程序清单。我不是在编写Sharepoint应用程序,而是在我们的集成服务器上运行,因此清单位让我感到困惑。我只是在我的帖子中添加了更多信息,希望能有所帮助。我正在开始对此进行调查,作为解决方案。我正在开始调查。