我有一个ASP.Net Core 2.0 MVC应用程序,将由内部和外部用户调用。此应用程序调用ASP.Net Core 2.0 Web API,所有这些都在同一个Azure租户中运行。
使用JWT Bearer令牌保护Web API。
如果可能,我想将内部用户的凭据传递给Web API。所以我正在尝试将Open ID与OAuth2 impllicit权限授予一起使用。
我做了以下事情:
在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 - 特别是上面列出的权限/角色。
每次登录我的网络应用程序时,都会收到提示您的同意:
这个应用程序想:
访问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的标头。我同意后一切正常 - 我只是不知道为什么我必须继续同意。
编辑:我正在尝试复制这个:
提前致谢!