[英]Microsoft Graph API and Outlook API in a Single App
我有一个使用MSAL连接到MS Graph的应用程序,并且能够使用API。 目前有几种Outlook API,例如https://msdn.microsoft.com/en-us/office/office365/api/calendar-rest-operations#GetRoomLists,Graph中当前不可用的FindRoomLists。
我需要在单个应用程序中同时使用这两个API吗? 我在Stack Overflow上读了一个类似的问题,它提到,令牌不能同时用于Graph和Outlook。 我做了尝试,但没有成功。
有什么建议么? 我是否打算退出使用Graph并转到Outlook API?
MSAL将查找缓存并返回任何与要求匹配的缓存令牌。 如果此类访问令牌已过期或没有合适的访问令牌,但存在关联的刷新令牌(需要offline_access
范围),则MSAL将自动使用该令牌来获取新的访问令牌并透明地返回它。
例如,如果您使用MSAL将授权代码兑换为Microsoft图形的访问令牌,则在openid connect owin中间件中:
AuthorizationCodeReceived = async (context) =>
{
var code = context.Code;
string signedInUserID = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value;
TokenCache userTokenCache = new MSALSessionCache(signedInUserID,
context.OwinContext.Environment["System.Web.HttpContextBase"] as HttpContextBase).GetMsalCacheInstance();
ConfidentialClientApplication cca =
new ConfidentialClientApplication(clientId, redirectUri, new ClientCredential(appKey), userTokenCache,null);
string[] scopes = { "Mail.Read" };
try
{
AuthenticationResult result = await cca.AcquireTokenByAuthorizationCodeAsync(code, scopes);
}
catch (Exception eee)
{
}
},
使用范围Mail.Read
可以获取Microsoft Graph的访问令牌,以读取用户的邮箱。现在,如果要在controller / action中调用Outlook Mail Rest api,则可以使用范围: https://outlook.office.com/mail.read
将使用缓存的刷新令牌获取Outlook邮件剩余api的令牌:
// try to get token silently
string signedInUserID = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
TokenCache userTokenCache = new MSALSessionCache(signedInUserID, this.HttpContext).GetMsalCacheInstance();
ConfidentialClientApplication cca = new ConfidentialClientApplication(clientId, redirectUri,new ClientCredential(appKey), userTokenCache, null);
if (cca.Users.Count() > 0)
{
string[] scopes = { "https://outlook.office.com/mail.read" };
try
{
AuthenticationResult result = await cca.AcquireTokenSilentAsync(scopes,cca.Users.First());
}
catch (MsalUiRequiredException)
{
try
{// when failing, manufacture the URL and assign it
string authReqUrl = await WebApp.Utils.OAuth2RequestManager.GenerateAuthorizationRequestUrl(scopes, cca, this.HttpContext, Url);
ViewBag.AuthorizationRequest = authReqUrl;
}
catch (Exception ee)
{
}
}
}
else
{
}
请参考代码示例: 使用OpenID Connect将Microsoft身份和Microsoft Graph集成到Web应用程序中 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.