#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. При локальном запуске события запускаются в таком порядке:
- RedirectToIdentityProvider
- Получено сообщение
- Получен токен безопасности
- Проверен токен безопасности
Но в 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.
- Перейдите на портал Azure,
- Выберите Azure Active Directory
- Выберите регистрации приложений
- Выберите свое приложение.
- Нажмите на манифест
- Найдите значение oauth2AllowIdTokenImplicitFlow и измените его значение на true
- Нажмите Сохранить
2) В вашем файле startup.cs измените следующее:
ResponseType = OpenIdConnectResponseType.Code
to
ResponseType = OpenIdConnectResponseType.CodeIdToken
и посмотрим, поможет ли это.