SharePoint应用程序中的Oauth2和访问令牌

时间:2016-05-19 03:35:57

标签: oauth-2.0 sharepoint-2013 office365 access-token

我正在SharePoint上创建一个内部网 - O365,我可以在这里创建一个小部件,我需要提取日历事件并将其显示一周。这是一个步骤:

一个。用户登录Intranet 湾生成访问令牌以访问Office 365 REST API C。获取并显示日历事件。

这是我的问题:

我想到了两个选项来生成访问令牌

选项a:创建一个WCF应用程序,该应用程序接受用户上下文并生成令牌。这将获取结果并更新列表。我的Intranet应用程序可以读取日历列表并更新小部件。这不起作用,因为我无法将用户上下文从SP传递到WCF方法,因此可以生成访问令牌。

选项b:使用以下代码(我现在已经完成),但它在URL中显示访问令牌,这对客户端不利。

var clientId ='>> sample>>';

var replyUrl    = '<<>>'; 
var endpointUrl = 'https://outlook.office365.com/api/v1.0/me/events';
var resource = "https://outlook.office365.com/"; 

var authServer  = 'https://login.windows.net/common/oauth2/authorize?';  
var responseType = 'token'; 


var url = authServer + 
        "response_type=" + encodeURI(responseType) + "&" + 
        "client_id=" + encodeURI(clientId) + "&" + 
        "resource=" + encodeURI(resource) + "&" + 
        "redirect_uri=" + encodeURI(replyUrl); 

window.location = url;

那么有没有其他方法可以实现这一目标?

Ankush

1 个答案:

答案 0 :(得分:0)

由于您提到要使用WCF,您是否正在开发提供的主机SharePoint应用程序?

如果我理解正确,我们可以使用显式授权代码授权流程,它不会将访问令牌暴露给用户代理。下图说明了授权代码授权流程: enter image description here

以下是检索Office 365资源的访问令牌的核心代码供您参考:

var signInUserId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
        var userObjectId = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;

        AuthenticationContext authContext = new AuthenticationContext(SettingsHelper.Authority, new ADALTokenCache(signInUserId));

        try
        {
            DiscoveryClient discClient = new DiscoveryClient(SettingsHelper.DiscoveryServiceEndpointUri,
                async () =>
                {
                    var authResult = await authContext.AcquireTokenSilentAsync(SettingsHelper.DiscoveryServiceResourceId,
                                                                               new ClientCredential(SettingsHelper.ClientId,
                                                                                                   SettingsHelper.ClientSecret),
                                                                               new UserIdentifier(userObjectId,
                                                                                                  UserIdentifierType.UniqueId));
                    string token= authResult.AccessToken;
                    return authResult.AccessToken;
                });

            var dcr = await discClient.DiscoverCapabilityAsync(capabilityName);

            return new OutlookServicesClient(dcr.ServiceEndpointUri,
                async () =>
                {
                    var authResult = await authContext.AcquireTokenSilentAsync(dcr.ServiceResourceId,
                                                                               new ClientCredential(SettingsHelper.ClientId,
                                                                                                    SettingsHelper.ClientSecret),
                                                                               new UserIdentifier(userObjectId,
                                                                                                  UserIdentifierType.UniqueId));

                    return authResult.AccessToken;
                });
        }

您可以参考here的完整代码示例。 here是一个有用的链接,可以讨论显式和隐式认证流程之间的区别。