【问题标题】:Implement outlook calendar api in outlook add-in在 Outlook 插件中实现 Outlook 日历 API
【发布时间】:2016-01-13 08:14:15
【问题描述】:

我正在尝试在 Outlook 365 插件中实现 Office365 Outlook 日历 API。 Outlook 日历 API 在 Web 应用程序中完全实现。 OAuth2 和 Web 应用程序中返回的 auth_token 一切正常。

我在加载项中使用 OAuth2 登录时遇到问题。如果您在加载项中打开 Microsoft 的 OAuth2-Login,一旦您输入您的 appdev****@outlook[dot]com-account,它就会打开一个 Internet Explorer 实例。这不适用于会话中保存的 auth_token。

我尝试将 auth_token 保存在数据库中(请参阅 //Test 部分)并为加载项中的用户请求它。此错误与 DataServiceClientExceptionUnauthorized 位置未知。

    [Route("SignIn")]
    public async Task<ActionResult> SignIn()
    {
        string authority = "https://login.microsoftonline.com/common";

        string clientId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
        AuthenticationContext authContext = new AuthenticationContext(authority);

        Uri redirectUri = new Uri(Url.Action("Authorize", "outlook", null, HttpContext.Request.Scheme));

        Uri authUri = await authContext.GetAuthorizationRequestUrlAsync(scopes, null, clientId,
            redirectUri, UserIdentifier.AnyUser, null);

        return Redirect(authUri.ToString());
    }

    [Route("Authorize")]
    public async Task<ActionResult> Authorize()
    {
        string authCode = Request.Query["code"];

        string authority = "https://login.microsoftonline.com/common";

        string clientId = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
        string clientSecret = "xxxxxxxxxxxx";
        AuthenticationContext authContext = new AuthenticationContext(authority);

        Uri redirectUri = new Uri(Url.Action("Authorize", "outlook", null, HttpContext.Request.Scheme));

        ClientCredential credential = new ClientCredential(clientId, clientSecret);

        try
        {
            var authResult = await authContext.AcquireTokenByAuthorizationCodeAsync(
                authCode, redirectUri, credential, scopes);

            HttpContext.Session.SetString("access_token", authResult.Token);
            HttpContext.Session.SetString("user_email", GetUserEmail(authContext, clientId));

            //*** TEST ***
            _dbContext.ApplicationUsers.FirstOrDefault(e => e.Email == "appdev****@outlook.com").AccessToken = authResult.Token;
            _dbContext.ApplicationUsers.FirstOrDefault(e => e.Email == "appdev****@outlook.com").Email = GetUserEmail(authContext, clientId);

            return Content("Access Token: " + authResult.Token + " Email: " + GetUserEmail(authContext, clientId));
        }
        catch (AdalException ex)
        {
            return Content(string.Format("ERROR retrieving token: {0}", ex.Message));
        }
    }

【问题讨论】:

    标签: c# office365 outlook-addin office365-apps office365api


    【解决方案1】:

    新答案 这是新一代 Office 加载项(以前称为 App for Office)和 OAUTH 身份验证的常见问题。加载项在沙盒 iFrame 中运行的事实强制在弹出窗口中进行身份验证。在父(沙盒 iFrame)窗口中检索身份验证令牌也存在一些问题,因为在此上下文中禁止帧通信。 我提出了一个解决方案here,但最好的解决方案来自Richard DiZerega,并提出了here。 据我了解,您尝试将 auth_token 保存在数据库中,以便稍后 iFrame 加载项会请求它。它对 Richard DiZerega 的提议是封闭的。

    旧的错误答案 您正面临此问题,因为您可能将 Azure AD 应用程序注册为 Web 应用程序。现在您正在使用没有任何“url 位置”的本机客户端请求它,这就是失败的原因。

    native client 有不同的身份验证方案。

    我认为这没什么大不了的,只是在您的 Azure AD 中用于本机客户端的 register another app(这是您创建应用程序时提出的第一个问题)。

    【讨论】:

    • 我既不托管 Web 应用程序,也不托管 azure 上的加载项。我通过以下方式注册了加载项:apps.dev.microsoft.com。此外,我在前端使用 angular 来利用单页应用程序的优势。我最近阅读了 OpenID Connect 以获取授权密钥,而不是 OAuth2。 OpenID Connect 是否更适合我的项目?
    • 1 - 在 azureAD 中注册应用程序不同于在 azure 上“托管”应用程序或加载项。它仅用于身份验证目的和请求 Microsoft API(Office365/Graph API 等),Web 应用程序可以托管在其他任何地方,也可以是本机客户端应用程序。我不知道 apps.dev.microsoft.com,但它似乎不如 AzureAD 强大。
    • 2- 我将 OpenID 连接用于代码授权流程,其中服务器向 Office365 API 而非客户端本身(本机客户端或 SPA webapp)执行经过身份验证的请求。它要复杂得多,但就我而言,我需要它。如果您只需要客户端(而不是您的服务器)向 Outlook API 发出请求,我建议您查看 adal.js 或 adal angular。这里有很多样本github.com/AzureAD
    • 我再次阅读了您的问题,我发现我完全错了。当您谈到“插件”时,我认为是 .NET 客户端插件。
    • 哦,好的。它是一个 Outlook 365/Exchange 插件。只是 XML 文件和我托管的 Web 应用程序。更多信息:Web 应用程序运行 ASP.Net 5、MVC 6 和 AngularJS。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多