CORS проблема с UseOpenIdConnectAuthentication - PullRequest
0 голосов
/ 29 мая 2019

Здесь Angularjs - это интерфейс, а Web API - это средний уровень.мы используем AzureAD OpenID connect для аутентификации.
Я столкнулся со следующей проблемой.из-за того, что моя целевая страница не загружается

Доступ к XMLHttpRequest по адресу https://login.microsoftonline.com/xx-86f1-41af-91ab-xxx/oauth2/authorize?client_id=xxxx1&response_mode=form_post&response_type=code%20id_token&scope=openid%20profile&state=OpenIdConnect.AuthenticationPropertiesxxxxx&noncexxxxx&redirect_uri=https%3A%2F%2Flocalhost%3A44300%2F&x-client-SKU=ID_NET451&x-client-ver=5.2.1.0' (перенаправлен с https% 3A% 2F% 2Flocalhost% 3A44300% 2F / api / Scorecard / GetServiceNameWithManagers? loginUser = loginUser =xxx@microsoft.com ') из источника' https% 3A% 2F% 2Flocalhost% 3A44300% 2F 'был заблокирован политикой CORS: Ответ на предварительный запрос не проходит проверку контроля доступа: Нет' Access-Control-Allow-Origin'заголовок присутствует на запрашиваемом ресурсе.

Я провел много исследований и применил Access-Control-Allow-Origin = * при запросе и ответе.также применяется app.UseCors (Owin.Cors.CorsOptions.AllowAll);но пока безуспешно.

рассмотрите следующий код, AuthorizationCodeReceived делегат не вызывает в первый раз, даже если пользователь вошел на сайт Microsoft.

Обратите внимание, этот код не работает в первый раз.Он будет работать после нескольких нажатий кнопок (постбэков), а затем через несколько минут, если мы запустим приложение, это вызовет проблему предварительной проверки CORS.Пожалуйста, помогите.

Это мой startup.cs

    public void Configuration(IAppBuilder app)
    {
        app.UseCors(Owin.Cors.CorsOptions.AllowAll);
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = "Cookies",
            CookieManager = new SystemWebChunkingCookieManager(),              
        });

        //// Bearer token authentication middleware.(Ex: request from web clients,ajax calls able to pass authenticated bearer info)
        app.UseWindowsAzureActiveDirectoryBearerAuthentication(
          new WindowsAzureActiveDirectoryBearerAuthenticationOptions
          {
              TokenValidationParameters = new TokenValidationParameters
              {
                  ValidAudience = ConfigurationManager.AppSettings["ida:Audience"],
                  TokenReplayCache = new TokenReplayCache(new MemoryCacheProvider())
              },
              Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
              Provider = new OAuthBearerAuthenticationProvider
              {
                  OnValidateIdentity = ctx =>
                  {
                      //// Retrieve user roles from the request.                                  
                      var authenticationTicket = ctx.Ticket;
                      if (authenticationTicket.Identity.IsAuthenticated)
                      {
                          ////Use the block when role/user specific authorization needs and to modify the user identity claims based on requirement
                      }

                      return Task.FromResult(0);
                  },
                  OnRequestToken = ctx => { return Task.FromResult(0); }
              }
          });

        //// Non Bearer authentication middleware. (Ex: request secured web api call directly from URL/Web API server scope it self)
        app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = ClientId,
                ClientSecret = ConfigurationManager.AppSettings["ida:AppKey"],
                Authority = Authority,
                PostLogoutRedirectUri = PostLogoutRedirectUri,
                AuthenticationMode = AuthenticationMode.Active,
                ResponseType = "code id_token",
                CallbackPath = new PathString("/"),


                Notifications = new OpenIdConnectAuthenticationNotifications()
                {
                    SecurityTokenValidated = context =>
                    {
                        if (context.AuthenticationTicket.Identity.IsAuthenticated)
                        {
                            ////Use the block when role/user specific authorization needs and to modify the user identity claims based on requirement
                        }

                        return Task.FromResult(0);
                    },
                    AuthorizationCodeReceived = async context =>
                    {
                        var code = context.Code;
                        ClientCredential credential = new ClientCredential(ClientId, Models.ConfigurationData.GraphSecret);
                        string userObjectID = context.AuthenticationTicket.Identity.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
                        AuthenticationContext authContext = new AuthenticationContext(Authority, new NaiveSessionCache(userObjectID));
                        Uri uri = new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path));
                        AuthenticationResult result = await authContext.AcquireTokenByAuthorizationCodeAsync(code, uri, credential, GraphResource);
                    },
                    RedirectToIdentityProvider = context =>
                    {

                        if (context.ProtocolMessage.RedirectUri == null)
                        {
                            ////To set the reply/redirect Url based on the request host environment. 
                            ////Hosting env details we get only through the owin context in startup and this is the delegate to set reply URL in OWincontext before the authentication. 
                            string ReplyAddress = context.Request.Scheme + "://" + context.Request.Host + "/";
                            context.ProtocolMessage.RedirectUri = ReplyAddress;
                        }
                        //context.OwinContext.Authentication.User.Identity.IsAuthenticated = true;
                        if (context.OwinContext.Authentication.User.Identity.IsAuthenticated && context.ProtocolMessage.RequestType != IdentityModel.Protocols.OpenIdConnect.OpenIdConnectRequestType.Logout)
                        {
                            ////To avoid infinite loop of redirections in request if user is authenticated and unauthorized.  
                            context.HandleResponse();
                            context.Response.StatusCode = (int)HttpStatusCode.Forbidden;
                        }

                        return Task.FromResult(0);
                    }
                },
                TokenValidationParameters = new TokenValidationParameters
                {
                    RoleClaimType = "roles",
                    TokenReplayCache = new TokenReplayCache(new MemoryCacheProvider())
                },
            });
        System.Web.Helpers.AntiForgeryConfig.UniqueClaimTypeIdentifier = System.IdentityModel.Claims.ClaimTypes.NameIdentifier;
    }

Доступ к XMLHttpRequest по адресу https://login.microsoftonline.com/xx-86f1-41af-91ab-xxx/oauth2/authorize?client_id=xxxx1&response_mode=form_post&response_type=code%20id_token&scope=openid%20profile&state=OpenIdConnect.AuthenticationPropertiesxxxxx&noncexxxxx&redirect_uri=https%3A%2F%2Flocalhost%3A44300%2F&x-client-SKU=ID_NET451&x-client-ver=5.2.1.0' (перенаправлен с https% 3A% 2F% 2Flocalhost% 3A44300% 2F/api/Scorecard/GetServiceNamxxxManagers?loginUser=xxx@microsoft.com ') из источника' https% 3A% 2F% 2Flocalhost% 3A44300% 2F 'заблокирован политикой CORS: Ответ на предварительный запрос не проходит проверку контроля доступа:В запрашиваемом ресурсе отсутствует заголовок «Access-Control-Allow-Origin».

1 Ответ

0 голосов
/ 29 мая 2019

Я думаю, вы неправильно поняли сообщение об ошибке.В нем говорится, что ваше приложение AngularJS пыталось сделать запрос к https://login.microsoftonline.com/xxx-xx-41af-91ab-xxx/oauth2/authorize и завершилось неудачно, потому что это был запрос из разных источников, и сервер не утвердил его, вернув заголовок Access-Control-Allow-Origin в ответе на запрос предварительной проверки (HTTPОПЦИИ метода).

Таким образом, вы не можете изменить его, добавив заголовки CORS в свой бэкэнд.authorize не предназначен для вызова запросами XMLHttpRequest - вы должны сделать полный запрос браузера на этот URL.Позже браузер будет перенаправлен на redirect_uri (значение параметра запроса) вместе с кодом авторизации или ошибкой.

...