Заявка эмитента на идентификацию пользователя не совпадает с заявкой nameid делегированной идентификации (идентификация актера)
Проблема в том, что мы не можем подключиться с помощью сертификата. Да ведь мы действительно не знаем. Мы надеемся, что сможем получить некоторую помощь по этому вопросу. Я могу представить вам еще несколько необработанных данных. Если вы хотите получать данные, не подвергнутые санитарной обработке, я могу это сделать, но только в частном порядке. В итоге мы получили два сообщения об ошибках:
Заявка эмитента на идентификацию пользователя не совпадает с заявкой nameid (идентификатора имени) делегированной идентификационной информации (идентификация субъекта). Ожидается, что эти два утверждения совпадают, и, следовательно, этот токен отклоняется.
Когда пользователи пытаются подключиться, это работает:
User 'i:0#.w|XXX-dev\XXX_dev_admin' logged in to SP site 'Team Site'
(Url: 'https://portal.XXX-dev.local/ins/134700')
Это также работает с олицетворением:
UserForClientContextSPHost = svc_xxxxxxxxx@XXX-dev.local
User 'i:0#.w|XXX-dev\svc_xxxxxxxxx' logged in to SP site 'Team Site'(Url: 'https://portal.XXX-dev.local/ins/134700')
Когда мы пытаемся использовать сертификаты, это идет не так:
Эта часть является глубокой отладкой от помощника токена:
/// <summary>
/// Retrieves an S2S access token signed by the application's private certificate on behalf of the specified
/// WindowsIdentity and intended for the SharePoint at the targetApplicationUri. If no Realm is specified in
/// web.config, an auth challenge will be issued to the targetApplicationUri to discover it.
/// </summary>
/// <param name="targetApplicationUri">Url of the target SharePoint site</param>
/// <param name="identity">Windows identity of the user on whose behalf to create the access token</param>
/// <returns>An access token with an audience of the target principal</returns>
Область запрашивает URL: https://portal.xxx-dev.local/ins/134700/, а соответствующая область - "2803fc7f-fa5d-407a-b921-3ecae88058d3"
Мы работаем в контексте высокой степени доверия, поэтому у нас нет пользователя Windows и нет претензий:
JsonWebTokenClaim[] claims = identity != null ? GetClaimsWithWindowsIdentity(identity) : null;So => claims == null
Наконец этот метод называется:
return GetS2SAccessTokenWithClaims(targetApplicationUri.Authority, realm, claims);
Полномочия "portal.XXX-dev.local"
Когда мы углубимся в метод GetS2SAccessTokenWithClaims, мы увидим, что создается actortoken:
{"typ":"JWT","alg":"RS256","x5t":"mQN7mCJyUpGtannrI5sr6oTdJwU"}.{"aud":"00000003-0000-0ff1-ce00-000000000000/portal.XXX-dev.local@2803fc7f-fa5d-407a-b921-3ecae88058d3","iss":"82c987be-b75b-4ddf-83d7-a3d7cf9b0a66@2803fc7f-fa5d-407a-b921-3ecae88058d3","nbf":"1529923577","exp":"1529966777","nameid":"496fc703-ad06-4672-be2a-cfdcaed9c774@2803fc7f-fa5d-407a-b921-3ecae88058d3"}
Токен используется, но мы видим это в комментарии TokenHelper.cs
// App-only token is the same as actor token for delegated case'
Используемый токен доступа является следующим: AppOnlyAccessTokenForSPHost
Мы видим, когда мы не работаем только с приложением: внешний эмитент токена должен совпадать с nameid токена актера. (см. конец истории)
Если это не только приложение, то используется следующее:
nameid, // outer token issuer should match actor token nameid audience
JsonWebSecurityToken jsonToken = new JsonWebSecurityToken(nameid, DateTime.UtcNow, DateTime.UtcNow.Add(HighTrustAccessTokenLifetime), outerClaims);
Так, с apponly = false, это работает, но с apponly = true, это не работает.
Таким образом, вышесказанное - это глубокое погружение в создание токена. Далее описывается сетевой трафик между нашим размещенным приложением в IIS и сервером Sharepoint Server с развернутым приложением. Мой текст выделен жирным шрифтом, поэтому вы можете лучше видеть разницу между ведением журнала и моими собственными добавлениями:
Так что это сводка сетевого трафика. Я могу предоставить файл журнала, но мне нужно очистить его, прежде чем он выйдет в открытый доступ:
Когда мы смотрим рукопожатие сертификации: все кажется хорошо (не так ли?)
System.Net Information: 0 : [1112] Current OS installation type is 'Server'.
System.Net Verbose: 0 : [4872] WebRequest::Create(https://portal.XXX-dev.local/ins/134700/_vti_bin/client.svc)
System.Net Verbose: 0 : [4872] HttpWebRequest#65296005::HttpWebRequest(https://portal.XXX-dev.local/ins/134700/_vti_bin/client.svc#-89446220)
System.Net Information: 0 : [4872] RAS supported: True
System.Net Verbose: 0 : [4872] ServicePoint#33094::ServicePoint(portal.XXX-dev.local:443)
System.Net.Sockets Verbose: 0 : [4872] DNS::TryInternalResolve(portal.XXX-dev.local)
System.Net.Sockets Verbose: 0 : [4872] Socket#45306114::Connect(10.0.2.5:443#84017585)
System.Net.Sockets Information: 0 : [4872] Socket#45306114 - Created connection from 10.0.2.6:1351 to 10.0.2.5:443.
System.Net Information: 0 : [4872] Connection#1224489 - Created connection from 10.0.2.6:1351 to 10.0.2.5:443.
System.Net Information: 0 : [4872] TlsStream#15480286::.ctor(host=portal.XXX-dev.local, #certs=0)
System.Net Information: 0 : [4872] Associating HttpWebRequest#65296005 with ConnectStream#35899697
System.Net Information: 0 : [4872] HttpWebRequest#65296005 - Request: GET /ins/134700/_vti_bin/client.svc HTTP/1.1
System.Net Information: 0 : [4872] ConnectStream#35899697 - Sending headers
{
Authorization: Bearer
Host: portal.XXX-dev.local
Connection: Keep-Alive
}.
System.Net Information: 0 : [4872] SecureChannel#53220401::.ctor(hostname=portal.XXX-dev.local, #clientCertificates=0, encryptionPolicy=RequireEncryption)
System.Net Information: 0 : [4872] Enumerating security packages:
System.Net Information: 0 : [4872] Negotiate
System.Net Information: 0 : [4872] NegoExtender
System.Net Information: 0 : [4872] Kerberos
System.Net Information: 0 : [4872] NTLM
System.Net Information: 0 : [4872] TSSSP
System.Net Information: 0 : [4872] pku2u
System.Net Information: 0 : [4872] WDigest
System.Net Information: 0 : [4872] Schannel
System.Net Information: 0 : [4872] Microsoft Unified Security Protocol Provider
System.Net Information: 0 : [4872] CREDSSP
System.Net Information: 0 : [4872] SecureChannel#53220401 - Left with 0 client certificates to choose from.
System.Net Information: 0 : [4872] AcquireCredentialsHandle(package = Microsoft Unified Security Protocol Provider, intent = Outbound, scc = System.Net.SecureCredential)
System.Net Information: 0 : [4872] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = (null), targetName = portal.XXX-dev.local, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
Я заметил следующие данные, которые отправляются на сервер:
.........ldap:///CN=XXX-dev-SPFARMXXX-Root,CN=SPFarmXXX-ad,CN=CDP,CN=Public%20Key%20Services,CN=Services,CN=Configuration,DC=XXX-dev,DC=local?certificateRevocationList?base?objectClass=cRLDistributionPoint0..
System.Net Information: 0 : [4872] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=OK).
System.Net Information: 0 : [4872] Remote certificate: [Version]
V3
[Subject]
CN=*.XXX-dev.local
Simple Name: *.XXX-dev.local
DNS Name: *.XXX-dev.local
[Issuer]
CN=XXX-dev-SPFARMXXX-Root, DC=XXX-dev, DC=local
Simple Name: XXX-dev-SPFARMXXX-Root
DNS Name: XXX-dev-SPFARMXXX-Root
[Serial Number]
5800000002DA96F25EA0DBC0AA000000000002
[Not Before]
3/17/2017 8:48:16 AM
[Not After]
3/17/2019 8:48:16 AM
[Thumbprint]
564BC61B424A6F21CCC6629ACADEE9F2C1FD3812
[Signature Algorithm]
sha1RSA(1.2.840.113549.1.1.5)
[Public Key]
Algorithm: RSA
Length: 2048
Key Blob: 30 82 01 0a 02 82 01 01 00 b2 5a e2 8f 4d 7b 84 26 84 7b 51 88 63 83 4a b7 5f b5 59 07 3a dd b8 41 dc ea f2 4f bd a0 d3 5e 5b de 40 5e 16 6c b1 38 d2 9b a9 4e 17 f6 4b 3c a6 a0 e1 6e a1 d7 86 76 20 ed 73 03 f2 7e d5 af 4b b2 e9 52 ae fe 55 f8 7a 3b 34 8f c3 9d 6d 23 35 c9 4d 30 45 cb d9 5b 14 98 10 0d 18 e8 a2 0f ea bb ea 9f c2 11 23 79 ef e5 ff 83 6a be 3a 36 d1 48 87 4d 17 ce a0 fe 8e a1 c0 ce 27 11 5f 4c 61 4f 9a 22 ce 7d 7b d1 1c 75 c1 e9 ae ....
System.Net Information: 0 : [4872] SecureChannel#53220401 - Remote certificate was verified as valid by the user.
System.Net Information: 0 : [4872] ProcessAuthentication(Protocol=Tls, Cipher=Aes256 256 bit strength, Hash=Sha1 160 bit strength, Key Exchange=44550 256 bit strength).
Затем выполняются следующие запросы:
System.Net Verbose: 0 : [4872] WebRequest::Create(https://portal.XXX-dev.local/ins/134700//_vti_bin/client.svc) (no ->/) System.Net Information: 0 : [4872] HttpWebRequest#6739836 - Request: GET /ins/134700//_vti_bin/client.svc HTTP/1.1 System.Net Information: 0 : [4872] ConnectStream#48047364 - Sending headers { Authorization: Bearer Host: portal.XXX-dev.local }.
System.Net Information: 0 : [4872] Connection#1224489 - Received status line: Version=1.1, StatusCode=401, StatusDescription=Unauthorized. System.Net Information: 0 : [4872] Connection#1224489 - Received headers { Transfer-Encoding: chunked X-SharePointHealthScore: 0 SPRequestGuid: d688749e-b5e1-308d-d529-2df0391f7a98 request-id: d688749e-b5e1-308d-d529-2df0391f7a98 X-FRAME-OPTIONS: SAMEORIGIN Cache-Control: private Content-Type: text/html; charset=UTF-8 Location: https://portal.XXX-dev.local/_vti_bin/client.svc/ Server: Microsoft-IIS/8.5 WWW-Authenticate: Bearer realm="2803fc7f-fa5d-407a-b921-3ecae88058d3",client_id="00000003-0000-0ff1-ce00-000000000000",trusted_issuers="82c987be-b75b-4ddf-83d7-a3d7cf9b0a66@2803fc7f-fa5d-407a-b921-3ecae88058d3,00000003-0000-0ff1-ce00-000000000000@2803fc7f-fa5d-407a-b921-3ecae88058d3",NTLM X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET MicrosoftSharePointTeamServices: 15.0.0.4893 X-Content-Type-Options: nosniff X-MS-InvokeApp: 1; RequireReadOnly Date: Mon, 25 Jun 2018 09:57:36 GMT }.
System.Net Verbose: 0 : [4872] Data from ConnectStream#32922036::Read
Следующее тело включено в вышеуказанный заголовок:
Нет операции прослушивания для https://portal.XXX-dev.local/_vti_bin/client.svc, но есть операция прослушивания для https://portal.xxx-dev.local/_vti_bin/client.svc/, так что вас перенаправляют туда.
Вывод System.Net:
System.Net Error: 0 : [4872] Exception in HttpWebRequest#6739836::GetResponse - The remote server returned an error: (401) Unauthorized..
Тем не менее, CSOM все еще выполняет дальнейшие запросы (не знаю почему, но на самом деле это вопрос, который мы задаем: загрузка сети и получение имени для входа).
System.Net Verbose: 0 : [4872] WebRequest::Create(https://portal.XXX-dev.local/ins/134700/_vti_bin/client.svc/ProcessQuery)
...
<?xml version="1.0" encoding="UTF-8"?> <Request xmlns="http://schemas.microsoft.com/sharepoint/clientquery/2009" AddExpandoFieldTypeSuffix="true" SchemaVersion="15.0.0.0" LibraryVersion="15.0.0.0" ApplicationName=".NET Library"> <Actions> <ObjectPath Id="2" ObjectPathId="1" /> <ObjectPath Id="4" ObjectPathId="3" /> <ObjectPath Id="6" ObjectPathId="5" /> <Query Id="7" ObjectPathId="3"> <Query SelectAllProperties="false"> <Properties> <Property Name="Title" ScalarProperty="true" /> <Property Name="Url" ScalarProperty="true" /> </Properties> </Query> </Query> <Query Id="8" ObjectPathId="5"> <Query SelectAllProperties="false"> <Properties> <Property Name="LoginName" ScalarProperty="true" /> </Properties> </Query> </Query> </Actions> <ObjectPaths> <StaticProperty Id="1" TypeId="{3747adcd-a3c3-41b9-bfab-4a64dd2f1e0a}" Name="Current" /> <Property Id="3" ParentId="1" Name="Web" /> <Property Id="5" ParentId="3" Name="CurrentUser" /> </ObjectPaths> </Request>
System.Net Information: 0 : [4872] HttpWebRequest#39549169 - Request: POST /ins/134700/_vti_bin/client.svc/ProcessQuery HTTP/1.1
System.Net Information: 0 : [4872] ConnectStream#54033113 - Sending headers
{
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Im1RTjdtQ0p5VXBHdGFubnJJNXNyNm9UZEp3VSJ9.eyJhdW....
Content-Type: text/xml
Host: portal.XXX-dev.local
Content-Length: 898
Expect: 100-continue
Accept-Encoding: gzip, deflate
}.
Однако из System.Sockets.Net извлекается следующее:
Заявка эмитента на идентификацию пользователя не совпадает с заявкой nameid (идентификатора имени) делегированной идентификационной информации (идентификация субъекта). Ожидается, что эти два утверждения совпадают, и, следовательно, этот токен отклоняется.
Если мы прочитаем это сообщение, полученное с сервера Sharepoint на уровне сокета, и объединим его с информацией, полученной из отладчика, я должен кое-что знать? Но я не вижу, что и что я могу с этим сделать. Итак, приступим:
И следующее исключение выдается в.NET C#:
Исключение: { "Status":7, "Response":{ "m_HttpResponseHeaders":[ "SPRequestGuid", "request-id", "X-FRAME-OPTIONS", "SPRequestDuration", "SPIisLatency", "Server", "" WWW-Authenticate "," X-Powered-By "," MicrosoftSharePointTeamServices "," X-Content-Type-Options "," X-MS-InvokeApp "," Date "," Content-Length "]," m_Uri ": " https://portal.xxx-dev.local/ins/134700/_vti_bin/client.svc/ProcessQuery ", "m_Certificate": null, "m_Version": {"Major": 1, "Minor": 1, " Build ": - 1," Revision ": - 1," MajorRevision ": - 1," MinorRevision ": - 1}," m_StatusCode ": 401," m_ContentLength ": 211," m_Verb ":" POST "," m_StatusDescription ":" Unauthorized "," m_MediaType ": null}," Message ":" Удаленный сервер возвратил ошибку: (401) Unauthorized.", "Data":{
},
"InnerException":null,
"StackTrace":" at System.Net.HttpWebRequest.GetResponse()\r\n at Microsoft.SharePoint.Client.SPWebRequestExecutor.Execute()\r\n at Microsoft.SharePoint.Client.ClientRequest.ExecuteQueryToServer(ChunkStringBuilder sb)\r\n at …",
"HelpLink":null,
"Source":"System"
}