如何在常规服务器任务中更新联机Excel工作表?

shstlldc  于 2023-02-05  发布在  其他
关注(0)|答案(2)|浏览(130)

需要我需要能够将联机Excel电子表格与数据库中的数据同步。
问题根据Microsoft Graph api docs,这些写入操作需要Delegated (work or school account)权限,无法使用应用程序权限完成。但是,我需要在没有用户交互的情况下定期在服务器上运行此操作。我尚未找到在没有用户交互的情况下获得Delegated (work or school account)权限类型的令牌的方法。是否可以在服务器上获得所需的令牌/权限?
到目前为止我已经阅读了大量有关Microsoft身份验证流程和应用程序方案的内容(例如,this article和它的许多下游),但我一直未能找到一个合适的前进路径,从这个研究到目前为止,守护进程应用程序工作流似乎是最合适的除了,据我所知,它只允许应用程序权限。代表流似乎是一个替代方案,但1.我必须选择一个Microsoft用户来代表执行此操作,这似乎很奇怪,2.我不确定我是否可以在从服务器进程中分离出一个用户后,对该用户进行身份验证,然后挂接到服务器上的令牌(不断刷新它?)。有没有办法让它工作?有没有更好的办法?

d7v8vwbk

d7v8vwbk1#

如果你在问题中提到的文件中的API是你的目标API,那么很明显你只能使用委托的api权限,也就是说你必须先让一个用户登录,你只能修改属于登录用户的驱动项中的excel文件(我是用我的账号登录的,我可以修改我的excel文件,但我不能修改你的excel文件)。
因此,您不希望每次都有一个用户登录,但您仍然希望使用此API,您只能尝试使用ROPC流在应用程序中硬编码用户名和密码(例如Excel管理员帐户的用户名和密码),并仅使您的应用程序修改属于此帐户的Excel文件。

var scopes = new[] { "Files.ReadWrite" };
var tenantId = "tenant_id";
var clientId = "azure_ad_app_id";
var options = new TokenCredentialOptions
{
      AuthorityHost = AzureAuthorityHosts.AzurePublicCloud
};
var userName = "username";
var password = "password";
var userNamePasswordCredential = new UsernamePasswordCredential(
                userName, password, tenantId, clientId, options);

var tokenRequestContext = new TokenRequestContext(scopes);
var request = await userNamePasswordCredential.GetTokenAsync(tokenRequestContext);
var res = request.Token;
thtygnil

thtygnil2#

    • 注意**:正如本MsDoc中所提到的,要更新range对象的属性,您必须只授予委派的API权限。
  • 如果要授予委派API权限,则必须仅使用交互式身份验证流(身份验证代码流、隐式流)
  • 如果您要授予应用程序API权限,则必须使用客户端凭据流。

我同意*@Tiny Wang *,你可以使用ROPC Flow(但微软不推荐),在那里你可以预定义用户名和密码。

我使用以下参数生成了访问令牌:

https://login.microsoftonline.com/TenantID/oauth2/v2.0/token

client_id:ClientID
client_secret:ClientSecret
username:admin@xxx.onmicrosoft.com 
password:****
grant_type:password
scope:https://graph.microsoft.com/Files.ReadWrite

通过使用上面的访问令牌,您可以尝试更新如下范围对象的属性:

在与服务器进程分离后对用户进行身份验证,然后挂在服务器上的令牌上(不断刷新它?)
如果不想通过引用此MsDoc连续刷新访问令牌,可以尝试延长访问令牌的生存期。

相关问题