Попытка войти в Azure AD с использованием OpenID и dotnetopenauth, но при этом появляется сообщение «Не найдена конечная точка OpenID». - PullRequest
0 голосов
/ 03 января 2019

Я искал в СО аналогичных вопросах и рассмотрел все из них, но не нашел ни одного, который помог бы мне решить проблему, с которой я столкнулся.

Я пытаюсь добавить аутентификацию в нашустаревшее веб-приложение для Azure AD.Другой разработчик уже добавил поддержку OpenID, поэтому я подумал, что самый простой способ заставить это работать - это использовать конечную точку OpenID в AzureAD и существующий код в нашем приложении.Однако я не смог заставить его работать.

Я не знаю, связана ли проблема с URL-адресом конечной точки, который я использую, с кодом, который мы используем для подключения и какУ меня настроено приложение AzureAD или из-за фундаментального недопонимания того, что я пытаюсь сделать.

Предполагается, что это мультитенантное приложение, то есть, если я правильно понял, пользователи могут входить с учетными записями.в нашей Azure AD или других Azure AD, а затем наше приложение может разрешить не предоставлять доступ.Но я даже не смог заставить его признать, что я нацеливаюсь на действительную конечную точку OpenID, а тем более даже войти в систему с пользователем из нашей собственной Azure AD.

Код OpenID написан с использованием http://dotnetopenauth.net/, и возникает ошибка, когда мы вызываем CreateRequest ()

Using OpenID As New OpenIdRelyingParty
Dim LoginEndpoint = "<azure ad endpoint goes here>"
Dim Request As IAuthenticationRequest = OpenID.CreateRequest(LoginEndpoint)
End Using

Для LoginEndpoint я перепробовал каждую комбинацию, о которой могу подумать.

В качестве базовой линии я протестировал сПервый Yahoo, который работает.Я использовал конечную точку https://me.yahoo.com

Затем, следуя MS Docs, я нашел https://login.microsoftonline.com/MyEXAMPLE.com/v2.0/.well-known/openid-configuration или https://login.microsoftonline.com/MyEXAMPL-GUID-0000-0000-000000000000/v2.0/.well-known/openid-configuration

и в возвращенном JSON я взял authorization_endpoint, который выглядел какhttps://login.microsoftonline.com/ANOTHER0-GUID-0000-0000-000000000000/oauth2/v2.0/authorize

Authorization_endpoint - это то, что я пытался передать как LoginEndpoint в приведенном выше примере кода.

Когда это не сработало, я попытался просмотреть страницу Yahoo и Azure AD.authorization_endpoint в браузере и Azure AD один сообщал о некоторых пропущенных полях, а Yahoo один сообщает 404, поэтому я предполагаю, что они не предназначались для непосредственного посещения в браузере.

Но, просто чтобы исчерпать всеВозможности Я попытался дать Azure AD одно из желаемых значений, передав их в строке запроса.Таким образом, я получил что-то вроде https://login.microsoftonline.com/ANOTHER0-GUID-0000-0000-000000000000/oauth2/v2.0/authorize?client_id=CLIENTID-GUID-0000-0000-000000000000&scope=openid

. Я получил client_id, зайдя в Azure AD и найдя приложение, которое я зарегистрировал, и получил значение, обозначенное Application ID.Я думаю Я сделал это, потому что у меня есть другое приложение, которое работает (ядро asp.net вместо веб-форм платформы asp.net), и мы использовали идентификатор приложения в качестве идентификатора клиента, и это сработало, но дайте мне знать, если я долженполучил идентификатор клиента откуда-то еще.

Во всяком случае, когда я сделал это и подключил его к браузеру, он показал страницу входа MS без ошибок, но когда я попытался использовать этот URL в своем коде в качестве LoginEndpoint, он по-прежнемуне сработало.

Я попытался посмотреть сетевой трафик в Fiddler, который веб-сервер отправляет и получает при входе в Yahoo против Azure AD, и хотя я нашел некоторые интересные вещи, я не нашел ничего, что могло бы помочьмне решить проблему.По сути, я думаю, что понимаю, почему dotnetopenauth.net не нравится URL-адрес, который я дал, но это не помогло мне исправить это.Это не моя область знаний, но я не видел того, что, по-моему, dotnetopenauth.net ищет, когда возвращается «обнаружение» в заголовках HTML и HTTP, поэтому он считает, что это не конечная точка OpenID.

Итак, в следующий раз я включил ведение журнала и попытался снова с обеими версиями моего URL-адреса конечной точки, но он не показал мне ничего полезного, но, возможно, это будет полезно для того, кто читает это.

2019-01-02 23:26:30,450 (GMT-5) [11] INFO  DotNetOpenAuth - DotNetOpenAuth.Core, Version=4.3.4.13329, Culture=neutral, PublicKeyToken=2780ccd10d57b246 (official)
2019-01-02 23:26:30,450 (GMT-5) [11] INFO  DotNetOpenAuth - DotNetOpenAuth.Core, Version=4.3.4.13329, Culture=neutral, PublicKeyToken=2780ccd10d57b246 (official)
2019-01-02 23:26:30,517 (GMT-5) [11] INFO  DotNetOpenAuth - Reporting will use isolated storage with scope: User, Domain, Assembly
2019-01-02 23:26:30,517 (GMT-5) [11] INFO  DotNetOpenAuth - Reporting will use isolated storage with scope: User, Domain, Assembly
2019-01-02 23:26:34,738 (GMT-5) [11] INFO  DotNetOpenAuth.Messaging.Channel - Scanning incoming request for messages: http://localhost:49221/Initial/Login.aspx?ReturnUrl=%2fDashboard.aspx
2019-01-02 23:26:34,738 (GMT-5) [11] INFO  DotNetOpenAuth.Messaging.Channel - Scanning incoming request for messages: http://localhost:49221/Initial/Login.aspx?ReturnUrl=%2fDashboard.aspx
2019-01-02 23:26:34,741 (GMT-5) [11] DEBUG DotNetOpenAuth.Messaging.Channel - Incoming HTTP request: GET http://localhost:49221/Initial/Login.aspx?ReturnUrl=%2fDashboard.aspx
2019-01-02 23:26:34,741 (GMT-5) [11] DEBUG DotNetOpenAuth.Messaging.Channel - Incoming HTTP request: GET http://localhost:49221/Initial/Login.aspx?ReturnUrl=%2fDashboard.aspx
2019-01-02 23:26:57,115 (GMT-5) [8] INFO  DotNetOpenAuth.Messaging.Channel - Scanning incoming request for messages: http://localhost:49221/Initial/Login.aspx?ReturnUrl=%2f
2019-01-02 23:26:57,115 (GMT-5) [8] INFO  DotNetOpenAuth.Messaging.Channel - Scanning incoming request for messages: http://localhost:49221/Initial/Login.aspx?ReturnUrl=%2f
2019-01-02 23:26:57,116 (GMT-5) [8] DEBUG DotNetOpenAuth.Messaging.Channel - Incoming HTTP request: GET http://localhost:49221/Initial/Login.aspx?ReturnUrl=%2f
2019-01-02 23:26:57,116 (GMT-5) [8] DEBUG DotNetOpenAuth.Messaging.Channel - Incoming HTTP request: GET http://localhost:49221/Initial/Login.aspx?ReturnUrl=%2f
2019-01-02 23:33:39,365 (GMT-5) [10] DEBUG DotNetOpenAuth.OpenId - .NET Uri class path compression overridden.
2019-01-02 23:33:39,365 (GMT-5) [10] DEBUG DotNetOpenAuth.OpenId - .NET Uri class path compression overridden.
2019-01-02 23:33:39,433 (GMT-5) [10] DEBUG DotNetOpenAuth.Http - HTTP GET https://login.microsoftonline.com/ANOTHER0-GUID-0000-0000-000000000000/oauth2/v2.0/authorize?client_id=CLIENTID-GUID-0000-0000-000000000000&scope=openid
2019-01-02 23:33:39,433 (GMT-5) [10] DEBUG DotNetOpenAuth.Http - HTTP GET https://login.microsoftonline.com/ANOTHER0-GUID-0000-0000-000000000000/oauth2/v2.0/authorize?client_id=CLIENTID-GUID-0000-0000-000000000000&scope=openid
2019-01-02 23:33:39,855 (GMT-5) [10] DEBUG DotNetOpenAuth.Yadis - HTML discovery failed to find any endpoints.
2019-01-02 23:33:39,855 (GMT-5) [10] DEBUG DotNetOpenAuth.Yadis - HTML discovery failed to find any endpoints.
2019-01-02 23:33:39,865 (GMT-5) [10] INFO  DotNetOpenAuth.Yadis - Performing discovery on user-supplied identifier: https://login.microsoftonline.com/ANOTHER0-GUID-0000-0000-000000000000/oauth2/v2.0/authorize?client_id=CLIENTID-GUID-0000-0000-000000000000&scope=openid
2019-01-02 23:33:39,865 (GMT-5) [10] INFO  DotNetOpenAuth.Yadis - Performing discovery on user-supplied identifier: https://login.microsoftonline.com/ANOTHER0-GUID-0000-0000-000000000000/oauth2/v2.0/authorize?client_id=CLIENTID-GUID-0000-0000-000000000000&scope=openid
2019-01-02 23:33:39,869 (GMT-5) [10] DEBUG DotNetOpenAuth.Yadis - Filtering and sorting of endpoints did not affect the list.
2019-01-02 23:33:39,869 (GMT-5) [10] DEBUG DotNetOpenAuth.Yadis - Filtering and sorting of endpoints did not affect the list.
2019-01-02 23:51:30,214 (GMT-5) [17] DEBUG DotNetOpenAuth.Http - HTTP GET https://login.microsoftonline.com/ANOTHER0-GUID-0000-0000-000000000000/oauth2/v2.0/authorize
2019-01-02 23:51:30,214 (GMT-5) [17] DEBUG DotNetOpenAuth.Http - HTTP GET https://login.microsoftonline.com/ANOTHER0-GUID-0000-0000-000000000000/oauth2/v2.0/authorize
2019-01-02 23:51:30,492 (GMT-5) [17] DEBUG DotNetOpenAuth.Yadis - HTML discovery failed to find any endpoints.
2019-01-02 23:51:30,492 (GMT-5) [17] DEBUG DotNetOpenAuth.Yadis - HTML discovery failed to find any endpoints.
2019-01-02 23:51:30,493 (GMT-5) [17] INFO  DotNetOpenAuth.Yadis - Performing discovery on user-supplied identifier: https://login.microsoftonline.com/ANOTHER0-GUID-0000-0000-000000000000/oauth2/v2.0/authorize
2019-01-02 23:51:30,493 (GMT-5) [17] INFO  DotNetOpenAuth.Yadis - Performing discovery on user-supplied identifier: https://login.microsoftonline.com/ANOTHER0-GUID-0000-0000-000000000000/oauth2/v2.0/authorize
2019-01-02 23:51:30,495 (GMT-5) [17] DEBUG DotNetOpenAuth.Yadis - Filtering and sorting of endpoints did not affect the list.
2019-01-02 23:51:30,495 (GMT-5) [17] DEBUG DotNetOpenAuth.Yadis - Filtering and sorting of endpoints did not affect the list.

Пожалуйстадайте мне знать любую дополнительную информацию, которая вам нужна, и я добавлю ее.

РЕДАКТИРОВАТЬ 2019-01-03 17:04 вечера Восточная, если я добавлю ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3

Я получуТо же исключение в моем приложении, но в журнале теперь отображаются следующие ошибки

2019-01-03 17:00:31,925 (GMT-5) [7] DEBUG DotNetOpenAuth.Http - HTTP GET https://login.microsoftonline.com/ANOTHER0-GUID-0000-0000-000000000000/oauth2/v2.0/authorize
2019-01-03 17:00:32,374 (GMT-5) [7] ERROR DotNetOpenAuth.Http - SendFailure connecting to https://login.microsoftonline.com/ANOTHER0-GUID-0000-0000-000000000000/oauth2/v2.0/authorize
2019-01-03 17:00:32,374 (GMT-5) [7] ERROR DotNetOpenAuth.Http - SendFailure connecting to https://login.microsoftonline.com/ANOTHER0-GUID-0000-0000-000000000000/oauth2/v2.0/authorize
2019-01-03 17:00:32,376 (GMT-5) [7] ERROR DotNetOpenAuth.Yadis - Error while performing discovery on: "https://login.microsoftonline.com/ANOTHER0-GUID-0000-0000-000000000000/oauth2/v2.0/authorize": DotNetOpenAuth.Messaging.ProtocolException: Error occurred while sending a direct message or getting the response. ---> System.Net.WebException: The underlying connection was closed: An unexpected error occurred on a send. ---> System.IO.IOException: Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. ---> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host
   at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   --- End of inner exception stack trace ---
   at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.FixedSizeReader.ReadPacket(Byte[] buffer, Int32 offset, Int32 count)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartSendBlob(Byte[] incoming, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
   at System.Net.TlsStream.CallProcessAuthentication(Object state)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
   at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.ConnectStream.WriteHeaders(Boolean async)
   --- End of inner exception stack trace ---
   at System.Net.HttpWebRequest.GetResponse()
   at DotNetOpenAuth.Messaging.StandardWebRequestHandler.GetResponse(HttpWebRequest request, DirectWebRequestOptions options)
   --- End of inner exception stack trace ---
   at DotNetOpenAuth.Messaging.StandardWebRequestHandler.GetResponse(HttpWebRequest request, DirectWebRequestOptions options)
   at DotNetOpenAuth.Messaging.UntrustedWebRequestHandler.GetResponse(HttpWebRequest request, DirectWebRequestOptions options)
   at DotNetOpenAuth.Yadis.Yadis.Request(IDirectWebRequestHandler requestHandler, Uri uri, Boolean requireSsl, String[] acceptTypes)
   at DotNetOpenAuth.Yadis.Yadis.Discover(IDirectWebRequestHandler requestHandler, UriIdentifier uri, Boolean requireSsl)
   at DotNetOpenAuth.OpenId.UriDiscoveryService.Discover(Identifier identifier, IDirectWebRequestHandler requestHandler, Boolean& abortDiscoveryChain)
   at DotNetOpenAuth.OpenId.IdentifierDiscoveryServices.Discover(Identifier identifier)
   at DotNetOpenAuth.OpenId.RelyingParty.AuthenticationRequest.Create(Identifier userSuppliedIdentifier, OpenIdRelyingParty relyingParty, Realm realm, Uri returnToUrl, Boolean createNewAssociationsAsNeeded)

с этим изменением код будет выглядеть так:

Using OpenID As New OpenIdRelyingParty
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3
Dim LoginEndpoint = "<azure ad endpoint goes here>"
Dim Request As IAuthenticationRequest = OpenID.CreateRequest(LoginEndpoint)
End Using

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Я публикую это как ответ на свой вопрос, но хочу предупредить, что я не уверен на 100%, что я прав в этом, но я почти уверен.

Я думаю, что моя проблема заключалась в том, что DotNetOpenAuth.net или, по крайней мере, его часть, которую я использовал, пытался создать соединение OpenID 2, где я пытался подключиться к конечной точке OpenID Connect.

Когда я начал это, я не осознавал, что они разные, и съел много времени, пока не наткнулся на объяснение.

В Got-репозитории DotNetOpenAuth.net действительно есть пример подключения к конечной точке AzureAD, но, похоже, он использует совершенно другой код и объекты, чем то, что было в моем коде и что я мог найти в DotNetOpenAuth. Чистая документация, на момент написания этой статьи. Может быть, я просто не смог его найти, но нигде не видел.

Поэтому я просто решил, что, поскольку мне все равно нужно было использовать что-то другое, я бы просто использовал Microsoft OpenID Connect и код AzureAD.

0 голосов
/ 04 января 2019

Пожалуйста, попробуйте добавить эту строку на свой веб-сайт, прежде чем вызывать OpenIdRelyingParty.CreateRequest:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 ;

Пожалуйста, дайте нам знать, если это поможет. Недавно мы обнаружили, что это решает проблему для некоторых конфигураций Azure.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...