【问题标题】:Microsoft Graph API and Outlook API in a Single App单个应用程序中的 Microsoft Graph API 和 Outlook API
【发布时间】:2017-08-17 03:48:43
【问题描述】:

我有一个使用 MSAL 连接到 MS Graph 的应用程序,并且能够使用 API。有几个 Outlook API,例如 https://msdn.microsoft.com/en-us/office/office365/api/calendar-rest-operations#GetRoomLists,FindRoomLists 目前在 Graph 中不可用。

我需要在一个应用中同时使用这两个 API 吗?我在 Stack Overflow 上阅读了一个类似的问题,其中提到,Token 不能同时用于 Graph 和 Outlook。我试过了,还是不行。

有什么建议吗?是我退出使用 Graph 并转到 Outlook API 的路径吗?

【问题讨论】:

    标签: outlook azure-active-directory microsoft-graph-api msal


    【解决方案1】:

    MSAL 将查找缓存并返回与要求匹配的任何缓存令牌。如果此类访问令牌已过期或不存在合适的访问令牌,但存在关联的刷新令牌(需要 offline_access 范围),MSAL 将自动使用它来获取新的访问令牌并透明地返回。

    例如,如果您使用 MSAL 将授权码兑换为 microsoft graph 的访问令牌,则在 openid 连接 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 的访问令牌,用于读取用户的邮箱。现在如果您想在控制器/操作中调用outlook mail rest api,您可以使用范围:@ 987654325@,MSAL 将使用缓存的刷新令牌获取 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
                {
    
                }
    

    请参考代码示例:Integrate Microsoft identity and the Microsoft Graph into a web application using OpenID Connect

    【讨论】:

    • 谢谢你运行这个并验证。我的是一个 UWP 应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-10
    • 2020-04-24
    相关资源
    最近更新 更多