Я использую ADAL 2.4.1 (для iOS).Приложение успешно получает токен после входа в Azure AD и может использовать токен для вызова веб-API и получения данных.Однако я закрыл / убил приложение и снова открыл приложение.Приложение все еще может получить токен, но не может получить данные из веб-API.Сервер возвращает HTML-скрипт приложению.
Приложение регистрируется в Azure AD, чтобы получить токен доступа и сохранить его в приложении (используя цепочку ключей).Я буду использовать сохраненный токен доступа для вызова API.
Функция для получения API:
ADAuthenticationContext *authContext = [ADAuthenticationContext authenticationContextWithAuthority:AUTHORITY_URL error:nil];
authContext.credentialsType = AD_CREDENTIALS_AUTO;
NSURL *redirectUri = [[NSURL alloc]initWithString:REDIRECT_URI];
[authContext acquireTokenWithResource:"api_path"
clientId:CLIENT_ID
redirectUri:redirectUri
promptBehavior:AD_PROMPT_AUTO
userId:nil
extraQueryParameters: @""
completionBlock:^(ADAuthenticationResult *result)
{
if (result.status != AD_SUCCEEDED)
{
completionBlock(nil, nil, result.error);
}
else
{
completionBlock(result.tokenCacheItem.userInformation, result.tokenCacheItem.accessToken, nil);
}
}];
Функция для получения формы данных WebAPI:
NSURL *url=[NSURL URLWithString:"API Path"];
NSData *postData = [post dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES];
NSString *postLength = [NSString stringWithFormat:@"%lu", (unsigned long)postData.length];
[[NSURLCache sharedURLCache] removeAllCachedResponses];
NSMutableURLRequest *request = [NSMutableURLRequest new];
[request setURL:url];
[request setHTTPMethod:@"POST"];
[request setTimeoutInterval: 15];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
NSString* authValueToken = [NSString stringWithFormat:@"Bearer %@", "ADAL Token"];
[request setValue:authValueToken forHTTPHeaderField:@"Authorization"];
[request setHTTPBody:postData];
[NSURLConnection sendAsynchronousRequest:request queue:opsQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error)
{
NSString* resultString = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
NSLog(@"result : %@", resultString);
Запустите приложение в первый раз, приложению необходимо войти в Azure AD или использовать другое приложение «Microsoft Authenticator» для получения токена.Успешно получить токен и получить данные из веб-API.Кроме того, приложение будет хранить токен в приложении (используя цепочку ключей).
Запустить приложение во второй раз, так как я выбираю AD_PROMPT_AUTO в функции «acquTokenWithResource».Приложение автоматически проверит, не истек ли токен (хранилище в цепочке для ключей) первым.Если не истек срок действия, он будет использовать этот токен для вызова API.Однако сервер возвращает HTML-скрипт в приложение.Этот HTML-скрипт такой же, как страница входа.
HTML-скрипт:
Sign in to your account
<noscript>
<meta http-equiv="Refresh" content="0; URL=https://login.microsoftonline.com/jsdisabled" />
</noscript>
<link rel="shortcut icon" href="https://secure.aadcdn.microsoftonline-p.com/ests/2.1.8383.13/content/images/favicon_a_eupayfgghqiai7k9sol6lg2.ico" />
<meta name="robots" content="none" />
https://login.live.com/logout.srf?iframed_by=https%3a%2f%2flogin.microsoftonline.com","urlUxPreviewOptOut":"https://login.microsoftonline.com/common/uxpreview/optout","showCantAccessAccountLink":true,"fShowAsyncTileLoad":true,"urlFeatureAnnouncementBlogPost":"https://aka.ms/AA1edlw","fCollapseExcessLinks":true,"fShowLoginV2PreviewLink":true,"fEnableShowResendCode":true,"iShowResendCodeDelay":90000,"sSMSCtryPhoneData":"AF~Afghanistan~93!!!AX~Ã…land.....