Asp.net Проверка подлинности useopenidconnect не работает в Azure

#asp.net #azure #owin #openid #openid-connect

#asp.net #azure #owin #OpenID #OpenID-connect

Вопрос:

Я использую UseOpenIdConnectAuthentication для аутентификации пользователей. Мой код приложения отлично работает локально. Но, когда я запускаю его в Azure, событие SecurityTokenValidated никогда не запускается. Следовательно, код выполняется нормально, но пользователь никогда не проходит проверку подлинности. Я не уверен, связана ли проблема с моим кодом или с Azure. Это используется в веб-форме, Asp.net приложение (не ядро). Я использую функцию трассировки Azure для входа в систему. Я вижу, что запускается только «RedirectToIdentityProvider». Никакое другое событие не вызывается. Вот мой код:

Startup.Auth.Vb:

  Public Sub ConfigureAuth(app As IAppBuilder)

      Dim clientId As String = ""
      Dim authority As String = ""
      Dim redirectURI As String

      Trace.TraceInformation("Hit Config Auth function")
      ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
      JwtSecurityTokenHandler.DefaultInboundClaimTypeMap = New Dictionary(Of String, String)

      app.SetDefaultSignInAsAuthenticationType("Cookies")
      app.UseCookieAuthentication(New CookieAuthenticationOptions() With {
                .AuthenticationMode = AuthenticationMode.Active,
                .CookieManager = New SystemWebCookieManager
            })  


      redirectURI = appSettings("ID_Redirect_URI")
      clientId = appSettings("ID_ClientID")
      authority = appSettings("ID_Authority")
      Trace.TraceInformation(redirectURI)
      Trace.TraceInformation(clientId)
      Trace.TraceInformation(authority)

      Trace.TraceInformation("creating OpenIDAuthOptions")
      Dim OpenIdAuthOption = New OpenIdConnectAuthenticationOptions() With {
           .SignInAsAuthenticationType = "Cookies",
           .Authority = authority,
           .RequireHttpsMetadata = False,
           .ClientId = clientId,
           .ResponseType = "id_token",
           .Scope = "openid profile roles",
           .RedirectUri = redirectURI,
           .PostLogoutRedirectUri = redirectURI,
           .Notifications = New OpenIdConnectAuthenticationNotifications() With {
                .AuthenticationFailed = Function(ctx)
                      Trace.TraceInformation("Auth Failed event")
                      Return Task.FromResult(0)
                 End Function,
                 .SecurityTokenReceived = Function(ctx)
                      Trace.TraceInformation("Sec Token Recieved event")
                      Return Task.FromResult(0)
                  End Function,
                  .MessageReceived = Function(ctx)
                      Trace.TraceInformation("Message Recieved event")
                      Return Task.FromResult(0)
                      End Function,
                  .SecurityTokenValidated = Function(ctx)
                     Trace.TraceInformation("Security token validated")                          
                     Return Task.FromResult(0)
                     End Function,
                  .AuthorizationCodeReceived = Function(ctx)
                     Trace.TraceInformation("Auth Code Recieved event")
                     Return Task.FromResult(0)
                     End Function,
                  .RedirectToIdentityProvider = Function(context)
                   Trace.TraceInformation("start of RedirectToIDProvider")
                    Return Task.FromResult(0)
                    End Function
                    }
            }

            Trace.TraceInformation("adding OpenIdAuthOptyions")
            app.UseOpenIdConnectAuthentication(OpenIdAuthOption)
            Trace.TraceInformation("finihsed adding OpenIdAuthOptyions")
        End Sub
  

Как я упоминал выше, этот код отлично работает локально. Это не работает только при размещении в Azure. При локальном запуске события запускаются в таком порядке:

  1. RedirectToIdentityProvider
  2. Получено сообщение
  3. Получен токен безопасности
  4. Проверен токен безопасности

Но в Azure запускается только RedirectToIdentityProvider.

Ответ №1:

Изменен ваш раздел Action to take when request is not authenticated в службе приложений Authentication/Authorization на портале azure с LogIn with Azure Active Directory на Allow Anonymous requests . Как показано на рисунке ниже:

введите описание изображения здесь

Тогда SecurityTokenValidated был бы запущен. Аутентификация служб приложений выполняется вне вашего приложения, поэтому настроенный код аутентификации в вашем приложении никогда не будет запущен. Когда вы отключаете это, это позволяет вашему приложению обрабатывать саму аутентификацию таким же образом, как и локально.

Вот похожая проблема, на которую вы могли бы сослаться.

Ответ №2:

Попробуйте изменить манифест приложения в определении приложения в Azure, чтобы присвоить свойству «oauth2AllowIdTokenImplicitFlow» значение true с false.

  1. Перейдите на портал Azure,
  2. Выберите Azure Active Directory
  3. Выберите регистрации приложений
  4. Выберите свое приложение.
  5. Нажмите на манифест
  6. Найдите значение oauth2AllowIdTokenImplicitFlow и измените его значение на true
  7. Нажмите Сохранить

2) В вашем файле startup.cs измените следующее:

 ResponseType = OpenIdConnectResponseType.Code
to
ResponseType = OpenIdConnectResponseType.CodeIdToken
  

и посмотрим, поможет ли это.