Azure WebApp-WebAPI -> Тип гранта authorization_code не возвращает RefreshToken - PullRequest
0 голосов
/ 23 марта 2020

Я следовал этому сообщению относительно этого примера и сделал дополнения к порталу и коду, как было предложено:

Портал: Web API - Expose API - добавить область действия для «offline_access» (также пытался с форматом «demo.offline_access»); В веб-приложении добавлено разрешение «offline_access»

Код: добавлено offline_access для Start_Auth.cs, Global.cs и обоих файлов Web.config.

Я делаю запрос на accessToken и refreshToken согласно документация с:

var ClientID = "XXXX";
            var BaseURL = "https://XXX.b2clogin.com/XXX.onmicrosoft.com/oauth2/v2.0/token?p=B2C_1_signinsignoutpolicy";
            var ClientSecret = "XXX";
            string redirectUri = "https://XXX.azurewebsites.net/api/GetAccessToken";
            var content = new StringContent(
              "&grant_type=authorization_code"+
              "&client_id="+ClientID+
              "&scope=" + "https://XXX.onmicrosoft.com/api/demo.read https://XXX.onmicrosoft.com/api/demo.write https://XXX.onmicrosoft.com/api/offline_access" +
              "&code="+authCode+
              "&redirect_uri=" + redirectUri+
              "&client_secret=" + ClientSecret,
              Encoding.UTF8,
              "application/x-www-form-urlencoded");

            var response = await httpClient.PostAsync(BaseURL, content);
            var output = await response.Content.ReadAsStringAsync();

на выходе возвращается access_token, но без refre sh токена. При рассмотрении утверждений access_token область действия (scp) правильно показывает offline_access demo.read demo.write

Чего мне не хватает, чтобы получить refre sh token?

[EDIT} Вот Результат почтальона: enter image description here JWT для полученного токена доступа: enter image description here Разрешения API WebApp: enter image description here WebAPI - Предоставление API: enter image description here

Изменения кода: Области WebApp и WebAPI Web.config:

<add key="api:ReadScope" value="demo.read" />
<add key="api:WriteScope" value="demo.write" />
<add key="api:OfflineScope" value="offline_access" />

Добавление области действия TaskWebApp Globals.cs:

// API Scopes
    public static string ApiIdentifier = ConfigurationManager.AppSettings["api:ApiIdentifier"];
    public static string ReadTasksScope = ApiIdentifier + ConfigurationManager.AppSettings["api:ReadScope"];
    public static string WriteTasksScope = ApiIdentifier + ConfigurationManager.AppSettings["api:WriteScope"];
    public static string OfflineTasksScope = ApiIdentifier + ConfigurationManager.AppSettings["api:OfflineScope"];
    public static string[] Scopes = new string[] { ReadTasksScope, WriteTasksScope, OfflineTasksScope };

TaskWebApp Startup.Auth.cs добавление области на ConfigureAuth:

// Specify the scope by appending all of the scopes requested into one string (separated by a blank space)
                Scope = $"openid profile offline_access {Globals.ReadTasksScope} {Globals.WriteTasksScope} {Globals.OfflineTasksScope}"

Спасибо за вашу помощь

1 Ответ

1 голос
/ 24 марта 2020

https://XXX.onmicrosoft.com/api/offline_access - это разрешение, которое вы настроили в своем веб-приложении API. Это не для получения токена refre sh.

Вам просто нужно использовать offline_access здесь.

"&scope=" + "https://XXX.onmicrosoft.com/api/demo.read https://XXX.onmicrosoft.com/api/demo.write offline_access"
...