Аутентификация API Azure

Я использую API Azure в коде C # и использую следующие библиотеки:

using Microsoft.Rest; using Microsoft.Rest.Azure.Authentication;
using Microsoft.Azure.Management.DataLake.Store;
using Microsoft.Azure.Management.DataLake.StoreUploader;
using Microsoft.Azure.Management.DataLake.Analytics;
using Microsoft.Azure.Management.DataLake.Analytics.Models;
using Microsoft.WindowsAzure.Storage.Blob;

Чтобы создать соединение с Azure:

private static ServiceClientCredentials AuthenticateAzure(string domainName, string nativeClientAppCLIENTID)
{
    // User login via interactive popup
    SynchronizationContext.SetSynchronizationContext(new SynchronizationContext());
    // Use the client ID of an existing AAD "Native Client" application.
    var activeDirectoryClientSettings = ActiveDirectoryClientSettings.UsePromptOnly(nativeClientAppCLIENTID, new Uri("urn:ietf:wg:oauth:2.0:oob"));
    return UserTokenProvider.LoginWithPromptAsync(domainName, activeDirectoryClientSettings).Result;
}

При вызове LoginWithPromptAsync у меня появилось всплывающее окно с запросом моих учетных данных. Я не хочу, чтобы это всплывающее окно появлялось каждый раз, когда я запускаю код. Есть ли какой-нибудь способ придумать что-то помимо создания приложения Azure?

У меня есть ApplicationId, TenantId, CertificateThumbprint и SubscriptionId (ниже). Могу ли я использовать эти поля для аутентификации в Azure без запроса?

пример учетных данных


person Ajay    schedule 21.12.2016    source источник
comment
Здесь приведены инструкции по созданию ServicePrinicpal для этого blog.davidebbo.com/2015/12/calling-arm-using-plain-rest.html   -  person Darrel Miller    schedule 22.12.2016


Ответы (1)


Мы можем использовать функцию UserTokenProvider.LoginSilentAsync(nativeClientAppClientid, domainName, userName, password), чтобы получить наши учетные данные без всплывающих окон. У меня он отлично работает, вот мой тестовый код. Как зарегистрировать WebApp, см. документ.

    static void Main(string[] args)
    {
        var certificate = AuthenticateAzure("your domain name", "Ad App client ID", "username", "password");
    }

    /// <summary>
    ///  Log in to azure active directory in non-interactive mode using organizational
    //   id credentials and the default token cache. Default service settings (authority,
    //   audience) for logging in to azure resource manager are used.
    /// </summary>
    /// <param name="domainName"> The active directory domain or tenant id to authenticate with</param>
    /// <param name="nativeClientAppClientid">  The active directory client id for this application </param>
    /// <param name="userName"> The organizational account user name, given in the form of a user principal name  (e.g. [email protected]).</param>
    /// <param name="password"> The organizational account password.</param>
    /// <returns>A ServiceClientCredentials object that can be used to authenticate http requests  using the given credentials.</returns>
    private static ServiceClientCredentials AuthenticateAzure(string domainName, string nativeClientAppClientid,string userName,string password)
    {
       return UserTokenProvider.LoginSilentAsync(nativeClientAppClientid, domainName, userName, password).Result;
    }

введите описание изображения здесь

Обновление:

Дополнительные сведения о том, как зарегистрировать приложение AD и назначить роль приложению, см. В документ. После этого мы можем получить tenantId, appId, secretKey с портала Azure. Затем мы можем использовать SDK Microsoft.IdentityModel.Clients.ActiveDirectory для получения токена. для аутентификации api.

Демо-код:

var subscriptionId = "Your subscrption";
var appId = "Registried Azure Application Id";
var secretKey = "Secret Key";
var tenantId = "tenant Id";
var context = new AuthenticationContext("https://login.windows.net/" + tenantId);
ClientCredential clientCredential = new ClientCredential(appId, secretKey );
var tokenResponse = context.AcquireTokenAsync("https://management.azure.com/", clientCredential).Result;
var accessToken = tokenResponse.AccessToken;
using (var client = new HttpClient())
{
    client.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken); 
    client.BaseAddress = new Uri("https://management.azure.com/");
    // Now we can party with our HttpClient!
}

введите описание изображения здесь

person Tom Sun - MSFT    schedule 22.12.2016
comment
Я использую API Azure для доступа к файлам ADLS и для некоторых манипуляций с файлами и хочу интегрироваться с проектом U-SQL. Каким будет доменное имя в этом случае? Во-вторых. Я не хочу регистрировать приложение на портале Azure. - person Ajay; 22.12.2016
comment
Azure также позволяет использовать самозаверяющий сертификат управления или Azure AD для аутентификации. Дополнительные сведения о сертификатах управления Windows Azure см. На странице документ. доменное имя: By default, a basic domain name at .onmicrosoft.com is included with your directory. Later, you can add a domain name that your organization already uses, such as contoso.com. - person Tom Sun - MSFT; 22.12.2016
comment
У меня есть ID приложения, TenantId и прочее. Поможет ли это мне пройти аутентификацию в лазурном без подсказок. Я отредактировал свой вопрос и прикрепил одно изображение .. Не могли бы вы помочь мне в этой строке .. Спасибо ... - person Ajay; 22.12.2016
comment
Спасибо за ваши усилия ... Я использую ваш код как есть с функцией AcquireTokenAsync. Поскольку метод является асинхронным, управление не достигает следующей строки var accessToken = tokenResponse.AccessToken; или не генерирует никаких ошибок аутентификации .... - person Ajay; 23.12.2016
comment
Привет, Аджай, var tokenResponse = context.AcquireTokenAsync("https://management.azure.com/", clientCredential).Result должен позволить нам получить tokenResponse. - person Tom Sun - MSFT; 23.12.2016
comment
Привет, Том, мне нужен объект ServiceClientCredentials в конце для создания экземпляра DataLakeStoreFileSystemManagementClient. Мне нужно получить доступ к файловой системе ADLS для некоторых манипуляций с файлами. Для вышеуказанной проблемы, поскольку мы используем метод async, мы должны использовать var tokenResponse = context.AcquireTokenAsync("https://management.azure.com/", clientCredential).ConfigureAwait(false) - person Ajay; 23.12.2016
comment
Привет, Том .. ur код отлично работает с консольным приложением, и я могу создать объект DataLakeStoreFileSystemManagementClient со следующим кодом ServiceClientCredentials creds = new TokenCredentials(tokenResponse.AccessToken); DataLakeStoreFileSystemManagementClient _adlsFileSystemClient = new DataLakeStoreFileSystemManagementClient(creds);, но когда я пытаюсь сделать что-нибудь _adlsFileSystemClient.FileSystem.GetFileStatus(_adlsAccountN‌​ame, Path.Combine(folderPath, fname));, он возвращает Microsoft.Azure.Management.DataLake.Store.Models.AdlsErrorException - person Ajay; 26.12.2016
comment
привет, Аджай, если хотите получить учетные данные для SDK для инициализации объекта DataLakeStoreFileSystemManagementClient, тогда мы можем сделать это легко с помощью var creds = ApplicationTokenProvider.LoginSilentAsync(tenantId, applicationId, secretKey).Result; var adlsFileSystemClient = new DataLakeStoreFileSystemManagementClient(creds);. О AdlsErrorExpection см. В другой ветке SO - person Tom Sun - MSFT; 27.12.2016
comment
Я добавил свою роль разработчика Data Lake Analytics, и все работает нормально ... Спасибо, Том за ваши усилия. Можете ли вы помочь мне с ошибкой stackoverflow.com/questions/41330565/ - person Ajay; 27.12.2016