AADSTS50059: При обнаружении кода с использованием "{prompt", "none"} "не обнаружено никакой информации, идентифицирующей арендатора. - PullRequest
0 голосов
/ 28 февраля 2019

Поэтому я использую библиотеку ADAL для получения идентификатора токена.Я получил пример кода отсюда пример кода

Однако, если я установлю строку запроса prompt в none.Я бы получил это надоедливое сообщение AADSTS50059: No tenant-identifying information found in either the request or implied by any provided credentials. Если пользователь не залогинился при получении кода.И экран будет зависать в окне входа Microsoft.

Мне нужно установить его как "prompt", "consent", чтобы даже не авторизованный пользователь мог выполнять вход / согласие.Но я хочу просто упростить процесс, а не заставлять пользователя проходить через этот вход / согласие каждый раз.

Есть ли способ сделать это так, чтобы для еще не вошедшего пользователя возвращалась ошибка обратного вызовавместо этой ошибки и зависания там навсегда?

Согласно doc , {prompt", "none"} должна быть допустимой конфигурацией.

Я скопирую пример кода здесь для удобной цели:

 protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.Params["code"] != null)
        {
            var accesstoken = AcquireTokenWithResource(resource: "https://graph.microsoft.com/");

            Response.Write(accesstoken);
        }
    }


    protected void Button2_Click(object sender, EventArgs e)
    {
        GetAuthorizationCode();
    }

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

        var parameters = new Dictionary<string, string>
            {
                { "response_type", "code" },
                { "client_id", "clientid" },
                { "redirect_uri", "http://localhost:8099/WebForm1.aspx" },
                { "prompt", "none"},
                { "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}", "tenantID"
                              ));
        ClientCredential clcred =
            new ClientCredential("clientID", "clientSecret");
        var token =
            ac.AcquireTokenByAuthorizationCodeAsync(code,
                       new Uri("http://localhost:8099/WebForm1.aspx"), clcred,resource).Result.AccessToken;

        return token;
    }
    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", "tenantID", @"oauth2/");
        }
    }

1 Ответ

0 голосов
/ 28 февраля 2019

Можете ли вы проверить подробные журналы этой ошибки.Если вы используете ADAL, это может быть проблема кэширования локального хранилища.например, при успешном входе в ADAL он кэширует информацию о входе в локальное хранилище вашего браузера, чтобы исключить необходимость повторного входа в систему в ближайшее время, но в определенных ситуациях, когда вы будете проходить аутентификацию на нескольких экземплярах Azure AD, это приведет к путанице в аутентификации.Чтобы это исправить, вам необходимо очистить кэш-память браузера с помощью инструментов разработчика (F12), затем перейти на вкладку «Приложение» и найти своего арендатора в разделе «Локальное хранилище».После удаления всех записей в хранилище для ADAL обновите страницу, на которой ранее была ошибка, и вы должны увидеть новый экран входа в систему.

Надеюсь, это поможет.

...