Я действительно нашел способ сделать это в «чистом» C #, не используя библиотеку MSAL, с которой у меня были некоторые проблемы.Поэтому, если вы ищете решение без MSAL, вы можете сделать это, как описано ниже.
Предварительные условия
- Пользователь должен существовать вAAD и не должен использовать учетную запись Microsoft (источник в Active Directory не должен быть «учетной записью Microsoft»).
Клиентское приложение должно быть зарегистрировано в Azure Active Directory.Клиентскому приложению должны быть предоставлены разрешения на приложение, которое вы хотите протестировать.Если клиентское приложение имеет тип «Native», секрет клиента не должен предоставляться.Если клиентское приложение имеет тип "Web app / api", необходимо указать секретный ключ клиента.В целях тестирования рекомендуется использовать приложение типа «Native» без секрета клиента.
Не должно быть двухфакторной аутентификации.
Код C #
Вы можете создать класс "JwtFetcher" и использовать такой код:
public JwtFetcher(string tenantId, string clientId, string resource)
{
this.tenantId = !string.IsNullOrEmpty(tenantId) ? tenantId : throw new ArgumentNullException(nameof(tenantId));
this.clientId = !string.IsNullOrEmpty(clientId) ? clientId : throw new ArgumentNullException(nameof(clientId));
this.resource = !string.IsNullOrEmpty(resource) ? resource : throw new ArgumentNullException(nameof(resource));
}
public async Task<string> GetAccessTokenAsync(string username, string password)
{
var requestContent = this.GetRequestContent(username, password);
var client = new HttpClient
{
BaseAddress = new Uri(ApplicationConstant.Endpoint.BaseUrl)
};
var message = await client.PostAsync(this.tenantId + "/oauth2/token", requestContent).ConfigureAwait(false);
message.EnsureSuccessStatusCode();
var jsonResult = await message.Content.ReadAsStringAsync().ConfigureAwait(false);
dynamic objectResult = JsonConvert.DeserializeObject(jsonResult);
return objectResult.access_token.Value;
}
private FormUrlEncodedContent GetRequestContent(string username, string password)
{
List<KeyValuePair<string, string>> requestParameters = new List<KeyValuePair<string, string>>()
{
new KeyValuePair<string, string>(ApplicationConstant.RequestParameterName.GrantType, ApplicationConstant.RequestParameterValue.GrantTypePassword),
new KeyValuePair<string, string>(ApplicationConstant.RequestParameterName.Username, username),
new KeyValuePair<string, string>(ApplicationConstant.RequestParameterName.Password, password),
new KeyValuePair<string, string>(ApplicationConstant.RequestParameterName.ClientId, this.clientId),
new KeyValuePair<string, string>(ApplicationConstant.RequestParameterName.Resource, this.resource)
};
var httpContent = new FormUrlEncodedContent(requestParameters);
return httpContent;
}
Тип предоставления для этого просто "пароль".