繁体   English   中英

单个应用程序中的Microsoft Graph API和Outlook API

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM