azure 如何获取访问令牌以从ASP连接到SharePoint Online,NET Web应用程序

368yc8dk  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(126)

我很感激任何帮助。
我正在尝试从我的ASP连接到SharePoint Online网站。NET Web应用程序。NET Framework 4.7.2
我已经创建了一个自签名证书,它已经安装在我的开发机器上,并上传到Azure应用程序注册(客户端应用程序),也是我自己创建的:

在开发机器上安装证书

证书上传到App注册

Azure应用程序注册(客户端应用程序)配置了几个API权限,其中一个用于与SharePoint数据交互:

API权限- SharePoint完全控制

当一个Http请求完成时,应该获取访问令牌的代码行没有响应,但也没有抛出错误:

生成访问令牌的代码行

我已经创建了几个证书,将DnsName等于localhost,但它不起作用。
结论:每次从前端应用程序完成http请求时,我都需要获取访问令牌,以便我的应用程序能够管理SharePoint端的信息。
Stuck code at line where access token sholud be generated

gopyfrb3

gopyfrb31#

大家好,提前感谢您提供的支持。
我找到了解决问题的方法。
基本上我已经将所有调用AccessToken方法的方法转换为异步方法,这意味着,从Web方法(控制器)到内部方法,它们现在都是异步的。下面是所有相互调用的方法,直到调用AccessToken方法:

public class SharePointController : ApiController
{
    [AllowAnonymous]
    [HttpGet]
    [Route("api/sharepoint/connect")]
    public async Task<bool> Connect()
    {
        var obj = new SPConnection())
        
        return await obj.ConnectWithToken();
        
    }
}
    
    
    public class SPConnection
        {
    public async Task<bool> ConnectWithToken()
        {
            var authority = $"https://login.microsoftonline.com/{this.AzureTenantId}/";
            var token = await GetAccessToken(this.AzureCertFile, this.AzureCertPassword, this.AzureClientId, this.AzureTenantId, this.AzureTenantName, authority);
    
            using (var context = new ClientContext(this.SiteUrl))
            {
                context.ExecutingWebRequest += (s, e) =>
                {
                    e.WebRequestExecutor.RequestHeaders["Authorization"] =
                        "Bearer " + token;
                };
    
                this.Web = context.Web;
                context.Load(Web,
                               w => w.Title,
                               w => w.Url,
                               w => w.Lists);
                await context.ExecuteQueryAsync();
    
                this.ClientCtx = context;
            }
    
            return true;
        }
    
        private async Task<string> GetAccessToken(string azureCertFile, string azureCertPassword, string azureClientId, string azureTenantId, string azureTenantName, string authority)
        {
            /*REQUIRED CODE HERE TO DO THIS WORKS*/
    
            try
            {
                authResult = await azureApp.AcquireTokenForClient(spScopes).ExecuteAsync();
            }
            catch (MsalUiRequiredException ex)
            {
                // The application doesn't have sufficient permissions.
                // - Did you declare enough app permissions during app creation?
                // - Did the tenant admin grant permissions to the application?
            }
            catch (MsalServiceException ex) when (ex.Message.Contains("AADSTS70011"))
            {
                // Invalid scope. The scope has to be in the form "https://resourceurl/.default"
                // Mitigation: Change the scope to be as expected.
            }
            catch (Exception ex)
            {
                //Other type of exceptions
            }
    
            return authResult != null ? authResult.AccessToken : null;
        }
        }

相关问题