我正在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
答案 0 :(得分:0)
由于您提到要使用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;
});
}