«Ошибка аутентификации Hyak.Common.Cloudexception» при попытке подключения к Azure и загрузки подписок - PullRequest
0 голосов
/ 08 октября 2018

Если получено исключение при попытке войти в систему и пройти аутентификацию в Azure с помощью моего кода После ошибки ASP.NET

Код неправильной настройки

private void LoadSubscriptions()
{
    if (Session["AzureAuthentication"] == null)
        return;

    var mainAuthRes = 
(Task<AuthenticationResult>)Session["AzureAuthentication"];

    var subscriptionCredentials = new TokenCloudCredentials(mainAuthRes.Result.AccessToken);

    var cancelToken = new CancellationToken();
    using (var subscriptionClient = new SubscriptionClient(subscriptionCredentials))
    {
        var tenants = subscriptionClient.Tenants.ListAsync(cancelToken).Result;
        foreach (var tenantDescription in tenants.TenantIds)

Я не могу выяснить, почему он выдает ошибку по адресу:
var tenants = subscriptionClient.Tenants.ListAsync(cancelToken).Result;

mainAuthRes.Result.AccessToken действительно показывает Accesstoken в отладке

Myкод авторизации

отправляет аутентификацию классу LoadSubscription в виде сеанса

public void GetAuthorizationCode()
{
    JObject response = new JObject();

    var parameters = new Dictionary<string, string>
        {
            { "response_type", "code" },
            { "client_id", clientId },
            { "redirect_uri", url },
            { "prompt", "login"},
            { "scope", "openid"}
        };

    var requestUrl = string.Format("{0}/authorize?{1}", EndPointUrl,BuildQueryString(parameters));

    Response.Redirect(requestUrl);

}

public string AcquireTokenWithResource(string resource)
{
    var code = Request.Params["code"];
    AuthenticationContext ac = new AuthenticationContext(string.Format("https://login.microsoftonline.com/{0}", directoryId));
    ClientCredential clcred = new ClientCredential(clientId, clientSecret);
        var result = ac.AcquireTokenByAuthorizationCodeAsync(code, new Uri(url), clcred, resource);

    Session["AzureAuthentication"] = result;

    return result.Result.AccessToken;
}

private string BuildQueryString(IDictionary<string, string> parameters)
{
    var list = new List<string>();

    foreach (var parameter in parameters)
    {
        list.Add(string.Format("{0}={1}", parameter.Key, HttpUtility.UrlEncode(parameter.Value)));
    }

    return string.Join("&", list);
}

protected string EndPointUrl
{
    get
    {
        return string.Format("{0}/{1}/{2}", "https://login.microsoftonline.com", directoryId, @"oauth2/");
    }
}

Может кто-нибудь увидеть, где что-то идет не так.

Если вам нужно больше подробностей, спроситея.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

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

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

0 голосов
/ 22 октября 2018

СТАРЫЙ (НЕ РАБОТАЕТ)

Я пришел к решению своих проблем вместе с другом @Brynn (https://stackoverflow.com/users/9015337/brynn). Мы искали ответы и пришлина этот код с помощью другого Stackoverflow Ответ о классе под названием «TokenCredentials» https://stackoverflow.com/a/37528016/10471807 Вот код аутентификации

public void LoadSub()
    {
        try
        {
            var ctx = new AuthenticationContext("https://login.microsoftonline.com/common");
            // This will show the login window
            var mainAuthRes = ctx.AcquireTokenAsync(m_resource, m_clientId, new Uri(m_redirectURI), new PlatformParameters(PromptBehavior.Always));
            var subscriptionCredentials = new TokenCredentials(mainAuthRes.Result.AccessToken);
            var cancelToken = new CancellationToken();
            using (var subscriptionClient = new SubscriptionClient(subscriptionCredentials))
            {
                var tenants = subscriptionClient.Tenants.ListAsync(cancelToken).Result;
                foreach (var tenantDescription in tenants)
                {
                    var tenantCtx = new AuthenticationContext("https://login.microsoftonline.com/" + tenantDescription.TenantId);
                    // This will NOT show the login window
                    var tenantAuthRes = tenantCtx.AcquireTokenAsync(
                        m_resource,
                        m_clientId,
                        new Uri(m_redirectURI),
                        new PlatformParameters(PromptBehavior.Never),
                        new UserIdentifier(mainAuthRes.Result.UserInfo.DisplayableId, UserIdentifierType.RequiredDisplayableId));
                    Debug.WriteLine(tenantDescription.TenantId);
                    var tenantTokenCreds = new TokenCredentials(tenantAuthRes.Result.AccessToken):

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...