【问题标题】:Oauth2 and Access Token in SharePoint AppSharePoint 应用程序中的 Oauth2 和访问令牌
【发布时间】:2016-05-19 18:20:25
【问题描述】:

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

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

这是我的问题:

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

选项 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 = 网址;

那么还有其他方法可以实现吗?

安库什

【问题讨论】:

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


    【解决方案1】:

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

    如果我理解正确,我们可以使用不向用户代理公开访问令牌的显式授权代码授予流程。下图说明了授权代码授予流程:

    以下是获取 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;
                    });
            }
    

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

    【讨论】:

    • 谢谢。不,基本上我想通过在 SharePOint 页面中嵌入一个可以调用 WCF 方法的 javascript 来实现这一点。
    猜你喜欢
    • 1970-01-01
    • 2013-04-11
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多