Azure Web应用程序一直提示同意

时间:2018-02-26 20:06:32

标签: azure asp.net-core oauth-2.0 azure-active-directory

我有一个ASP.Net Core 2.0 MVC应用程序,将由内部和外部用户调用。此应用程序调用ASP.Net Core 2.0 Web API,所有这些都在同一个Azure租户中运行。

使用JWT Bearer令牌保护Web API。

如果可能,我想将内部用户的凭据传递给Web API。所以我正在尝试将Open ID与OAuth2 impllicit权限授予一起使用。

我做了以下事情:

  • 通过在Azure中的Web应用程序清单中将oauth2AllowImplicitFlow设置为True来允许OAuth2隐式流。
  • 在Web API中添加了一个应用程序角色,其allowMemberType为Application:

    "appRoles": [
    {
      "allowedMemberTypes": [
        "Application"
      ],
      "displayName": "Access MyWeb API",
      "id": "<Guid>",
      "isEnabled": true,
      "description": "Access MyWeb API.",
      "value": "MyWebApi.Access"
    }],
    
  • 在Web应用程序的AAD应用程序注册中添加了一个权限,用于调用wepi API - 特别是上面列出的权限/角色。

  • 通过管理员同意授权授予此权限(我已尝试点击Azure中的“授予权限”选项以及管理员同意网址。)
  • 配置Web应用程序以获取可用于隐式流的访问令牌 - 该代码如下所示。

每次登录我的网络应用程序时,都会收到提示您的同意:

  

这个应用程序想:

     

访问MyWeb API(WebAPI)
  访问MyWeb API   这是一个许可   要求访问您的数据。

     

登录并阅读用户   个人资料

     

允许用户登录该应用,并允许该应用   阅读已登录用户的个人资料。它还允许应用程序阅读   登录用户的基本公司信息   这是一个许可   要求访问您的数据。

如果我接受这个专注,然后重新启动应用程序,我会收到提示AGAIN;我只需要同意一次,对吗? 我曾在一段时间之前尝试使用Implicit流程,现在我又回到了它。在我的第一次尝试中,我在我的租户中设置了类似的一对应用程序。只是为了笑容,我修改了我的应用程序和API以使用我之前尝试的应用程序注册,并且工作完美。使用不同的应用程序注册的相同代码工作正常。所以我一定错过了Azure配置中的一个步骤。有没有人知道为什么同意似乎没有“坚持”?

我不能简单地恢复这些注册;我最终必须在客户的Azure中安装这些,所以我需要知道如何正确设置它。

我尝试比较旧的和新的Web应用程序注册以及新旧Web API注册的清单;我没有看到任何跳出来的东西。

以下是使用OpenId配置隐式流的代码:

    private static IServiceCollection ConfigureAzureAdSettings(this IServiceCollection services, IConfiguration configuration)
    {
        return services.Configure<AzureAdSettings>(options => configuration.Bind("Authentication:AzureAd", options))
                       .AddSingleton<IConfigureOptions<OpenIdConnectOptions>, ConfigureOpenIdImplicitFlowOptions<MyWebApiSettings>>();
    }

以下是ConfigureOpenIdImplicitFlowOptions中设置OpenId值的代码;

    public void Configure(string name, OpenIdConnectOptions options)
    {
        options.ResponseType = "token id_token"; 
        options.ClientId = _azureAdSettings.ClientId;
        options.Authority = $"{_azureAdSettings.Instance}{_azureAdSettings.TenantId}";
        options.CallbackPath = _azureAdSettings.CallbackPath;
        options.Resource = _implicitFlowTarget.Resource;
        options.RequireHttpsMetadata = false;
        options.UseTokenLifetime = true;
        options.SaveTokens = true;
    }

然后,我可以获取Web应用程序控制器内的access_token,以设置调用Web API的标头。我同意后一切正常 - 我只是不知道为什么我必须继续同意。

编辑:我正在尝试复制这个:

https://blogs.msdn.microsoft.com/gianlucb/2017/10/04/access-an-azure-ad-secured-api-with-asp-net-core-2-0/

提前致谢!

0 个答案:

没有答案