如何在同一应用程序(办公室365)中同时配置表单身份验证和Azure身份验证?

时间:2018-08-23 05:47:07

标签: c# asp.net-mvc office365 microsoft-graph azure-ad-graph-api

您好,我已经使用Microsoft Graph API开发了一个Microsoft应用程序,以获取计划程序数据并将其暂时存储在数据库中。就其本身而言,该应用程序可以正常运行而没有任何问题。

对我来说,下一个任务是将这个独立的应用程序集成到公司的主要应用程序中。主公司的网站使用表单身份验证。整合此的最佳方法是什么。当前,当我尝试登录以获取授权时,我被重定向到表单登录名,而不是Microsoft

我已经在Microsoft应用程序注册池中注册了该应用程序。我还添加了Office 365 API

这是我正在使用的令牌获取代码

    public async Task<string> GetUserAccessTokenAsync()
    {
        string signedInUserID = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;


        tokenCache = new SessionTokenCache(
          signedInUserID,
          HttpContext.Current.GetOwinContext().Environment["System.Web.HttpContextBase"] as HttpContextBase);
        //var cachedItems = tokenCache.ReadItems(appId); // see what's in the cache

        ConfidentialClientApplication cca = new ConfidentialClientApplication(
            appId,
            redirectUri,
            new ClientCredential(appSecret),
            tokenCache);

        try
        {
            AuthenticationResult result = await cca.AcquireTokenSilentAsync(scopes.Split(new char[] { ' ' }));
            return result.Token;
        }

        // Unable to retrieve the access token silently.
        catch (MsalSilentTokenAcquisitionException)
        {
            HttpContext.Current.Request.GetOwinContext().Authentication.Challenge(
                new AuthenticationProperties() { RedirectUri = "/" },
                OpenIdConnectAuthenticationDefaults.AuthenticationType);

            throw new Exception(Resource.Error_AuthChallengeNeeded);
        }
    } 

这是我尝试直接登录时尝试使用的登录方法

        // Signal OWIN to send an authorization request to Azure.
        HttpContext.GetOwinContext().Authentication.Challenge(
          new AuthenticationProperties { RedirectUri = "/" },
          OpenIdConnectAuthenticationDefaults.AuthenticationType);     

1 个答案:

答案 0 :(得分:0)

我通过实现以下代码解决了这个问题

    public ActionResult SignIn()
    {
        var authContext = new AuthenticationContext("https://login.microsoftonline.com/common");
        string redirectUri = Url.Action("Authorize", "Planner", null, Request.Url.Scheme);

        Uri authUri = authContext.GetAuthorizationRequestURL("https://graph.microsoft.com/", SettingsHelper.ClientId,
new Uri(redirectUri), UserIdentifier.AnyUser, null);

        // Redirect the browser to the Azure signin page
        return Redirect(authUri.ToString());
    }

    public async Task<ActionResult> Authorize()
    {
        // Get the 'code' parameter from the Azure redirect
        string authCode = Request.Params["code"];

        AuthenticationContext authContext = new AuthenticationContext(SettingsHelper.AzureADAuthority);

        // The same url we specified in the auth code request
        string redirectUri = Url.Action("Authorize", "Planner", null, Request.Url.Scheme);

        // Use client ID and secret to establish app identity
        ClientCredential credential = new ClientCredential(SettingsHelper.ClientId, SettingsHelper.ClientSecret);

        try
        {
            // Get the token
            var authResult = await authContext.AcquireTokenByAuthorizationCodeAsync(
                authCode, new Uri(redirectUri), credential, SettingsHelper.O365UnifiedResource);

            // Save the token in the session
            Session["access_token"] = authResult.AccessToken;

            return Redirect(Url.Action("Index", "Planner", null, Request.Url.Scheme));
        }
        catch (AdalException ex)
        {
            return Content(string.Format("ERROR retrieving token: {0}", ex.Message));
        }
    } 

与解决这一问题的解决方案的链接是这样的。它虽然有点旧,但仍然帮了大忙 https://www.vrdmn.com/2015/05/using-office-365-unified-api-in-aspnet.html