2017-02-07 29 views
0

У меня есть мир кода, который работает в .Net Framework 4.5, но для которого мне нужен эквивалент в .Net 3.5. И моя проблема в том, что почти все мои поисковые запросы Google приводят к любым решениям, использующим новый WIF или общую информацию о старом WIF 3.5.АутентификацияContext.AcquireToken эквивалент в .NET 3.5

код выглядит следующим образом:

using Microsoft.IdentityModel.Clients.ActiveDirectory; 

namespace x 
{ 
    class y 
    { 
     public string GetAuthenticationHeader(Ax7Config config) 
     { 
      var user = new UserCredential(config.username, config.password); 
      return new AuthenticationContext(config.tenant) 
       .AcquireToken(config.resource, config.clientAppId, user) 
       .CreateAuthorizationHeader(); 
     } 
    } 
} 

PS: Результирующий длл импортируются как плагин в приложении, работающее на системе 3.5 .net и не может быть повторен до последней рамки. Так что это не сработает.

Пс: Для чего это стоит, я знаю, что .CreateAuthorizationHeader() просто возвращает "Bearer " + AccessToken. Так что это не проблема. Получить AccessToken.

ответ

0

В конце концов, AcquireToken просто отправляет запрос https на ваш STS. Вы можете легко имитировать это самостоятельно. Запрос выглядит следующим образом (для AAD):

POST https://login.microsoftonline.com/your-tenant-id/oauth2/token HTTP/1.1 
Accept: application/json 
x-client-Ver: 3.13.5.907 
x-client-CPU: x64 
x-client-OS: Microsoft Windows NT 6.2.9200.0 
x-ms-PKeyAuth: 1.0 
client-request-id: 10a9f6d3-1247-493e-874f-fab04e1427c7 
return-client-request-id: true 
Content-Type: application/x-www-form-urlencoded 
Host: login.microsoftonline.com 
Content-Length: 183 
Expect: 100-continue 
Connection: Keep-Alive 

resource=your-resource-guid&client_id=your-lcient-guid&client_secret=***** CREDENTIALS REMOVED HERE *****&grant_type=client_credentials 

Это легко сделать с помощью WebClient (p.e; How to fill forms and submit with Webclient in C#). Ответ сервера обычно будет что-то вроде этого:

HTTP/1.1 200 OK 
Cache-Control: no-cache, no-store 
... 
Content-Type: application/json; charset=utf-8 
Expires: -1 
Server: Microsoft-IIS/8.5 
Strict-Transport-Security: max-age=31536000; includeSubDomains 
X-Content-Type-Options: nosniff 
client-request-id: 10a9f6d3-1247-493e-874f-fab04e1427c7 
x-ms-request-id: bla-bla 
… 
X-Powered-By: ASP.NET 
Date: Thu, 23 Feb 2017 08:35:26 GMT 
Content-Length: 1278 

{"token_type":"Bearer","expires_in":"3599","ext_expires_in":"10800","expires_on":"1487842528","not_before":"1487838628","resource":"your-resource-id","access_token":"your-access-token"} 

В результате JSON и маркер в «access_token» поле. Вы можете использовать такой инструмент, как Fiddler, чтобы получить ваш запрос правильно, но это в основном то, что ему нужно. (Вы, вероятно, будете использовать Newtonsoft для десериализации json правильно.)

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