【问题标题】:Azure WebApp-WebAPI ->Grant Type authorization_code doesn't return RefreshTokenAzure WebApp-WebAPI->授权类型授权代码不返回 RefreshToken
【发布时间】:2020-07-03 18:31:55
【问题描述】:

我已经关注了这个post 和这个example,并按照建议添加了门户和代码:

门户:Web API - 公开 API - 为“offline_access”添加范围(也尝试使用“demo.offline_access”格式); Web App 添加了“offline_access”权限

代码:向 Start_Auth.cs、Global.cs 和两个 Web.config 文件添加了 offline_access。

我根据documentation 提出我对 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 但没有刷新令牌。查看 access_token 的声明时,范围 (scp) 正确显示了 offline_access demo.read demo.write

我缺少什么来获取刷新令牌?

[编辑} 这是邮递员的结果: 接收到访问令牌的 JWT: WebApp API 权限: WebAPI - 公开一个 API:

代码更改: 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 };

在 ConfigureAuth 中添加 TaskWebApp Startup.Auth.cs 范围:

// 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}"

感谢您的帮助

【问题讨论】:

  • 我已经尝试过使用邮递员并且非常适合我。你能确定你在邮递员上也遇到过同样的问题吗?

标签: azure authorization access-token azure-ad-b2c refresh-token


【解决方案1】:

https://XXX.onmicrosoft.com/api/offline_access 是您在 Web api 应用程序中自定义的权限。不是为了获取刷新令牌。

你只需要在这里使用offline_access

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

【讨论】:

  • 谢谢@Allen Wu,我在自定义offline_access 之前就已经有了,但没用(// 通过将所有请求的范围附加到一个字符串中来指定范围(用空格分隔) = $"openid profile offline_access {Globals.ReadTasksScope} {Globals.WriteTasksScope}"),我应该在示例中的哪里添加它(请参阅发布的代码设置)。我还应该在门户中进行任何更改吗?
  • @SergioSolorzano 删除 Azure 门户上 WebAPI 下的 offline_access 权限。您也可以尝试仅使用"&amp;scope=" + "offline_access" 来查看是否可以获得刷新令牌。如果可以的话,请在删除offline_access权限后尝试"&amp;scope=" + "https://XXX.onmicrosoft.com/api/demo.read https://XXX.onmicrosoft.com/api/demo.write offline_access"
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 2021-01-20
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 2018-07-05
相关资源
最近更新 更多