在ASP.NET Core 2.0中从另一个(无用户交互)授权一个应用程序服务

我在面向Internet(PubWeb)的Azure中有一个Web API应用程序,因此它可以在任何地方使用。 我创建了一个Web API(再次,在Azure中,我们称之为InWeb)。 我想要强有力的安全规则:

  1. InWeb必须仅由PubWeb使用。 这可能涉及一些网络安全 – 这是一个简单的部分(在Azure中)。
  2. PubWeb必须以某种方式由Azure AD授权才能使用InWeb服务。 我想到了服务负责人,证书等。 但我不确定。

那么2的最佳解决方案是什么?

更新 – 这里是InWeb Core 2.0 Auth设置:

public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(sharedOptions => { sharedOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddAzureAdBearer(options => Configuration.Bind("AzureAd", options)); services.AddMvc(options => { options.InputFormatters.Add(new TextPlainInputFormatter()); }); } 

您必须将两个API注册为Azure AD中的应用程序。 这可以通过Azure Active Directory刀片的应用程序注册来完成

现在我假设对PubWeb的调用未使用Azure AD承载令牌进行身份validation。 这意味着您唯一的选择是在调用InWeb时使用应用程序权限和客户端凭据授予。

要定义应用程序权限,您必须向InWeb的清单添加“app role”。 您可以通过单击Azure AD中InWeb应用程序刀片中的“清单”按钮来打开清单。

这是一个示例app角色:

 "appRoles": [ { "allowedMemberTypes": [ "Application" ], "displayName": "Read all things", "id": "32028ccd-3212-4f39-3212-beabd6787d81", "isEnabled": true, "description": "Allow the application to read all things as itself.", "value": "Things.Read.All" } ], 

您应该为它生成一个新的ID,并将显示名称和描述设置为您想要的任何内容。 当PubWeb调用InWeb时,该将出现在令牌中。

现在你必须去PubWeb的刀片,并转到所需的权限。

在那里,您必须转到添加 – >选择InWeb – >勾选您刚刚定义的应用程序权限。

然后单击“ 授予权限” 。 现在PubWeb有权调用InWeb。

您还需要为PubWeb生成密钥/客户端密钥。 这本质上是它的密码。 您还需要PubWeb的客户端ID /应用程序ID。

您还需要InWeb的App ID URI 。 您可以从Azure AD中的刀片中的“属性”中找到它。 这将是我们将从PubWeb获取令牌的资源

您还需要Azure AD的ID。 您可以从主Azure AD刀片中的“属性”中找到它。

现在要获取令牌,您需要使用OAuth2客户端凭据授权流程。 最简单的方法是使用像ADAL这样的库: https ://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-authentication-libraries。

如果您想手动执行此操作,可以在此处找到有关HTTP调用的详细信息: https : //docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-oauth-service -to-服务#服务到服务的访问令牌请求

它看起来像这样:

 POST /contoso.com/oauth2/token HTTP/1.1 Host: login.microsoftonline.com Content-Type: application/x-www-form-urlencoded grant_type=client_credentials&client_id=625bc9f6-3bf6-4b6d-94ba-e97cf07a22de&client_secret=qkDwDJlDfig2IpeuUZYKH1Wb8q1V0ju6sILxQQqhJ+s=&resource=https%3A%2F%2Fservice.contoso.com%2F 

将客户端ID设置为PubWeb的客户端ID,将客户端密码设置为PubWeb的客户端密钥。 资源应该是InWeb的App ID URI。

您应该收到响应中的访问令牌,您需要将其作为标题附加到您对InWeb的请求:

 Authorization: Bearer access-token-here 

当然,InWeb当然也必须validation令牌。 这是一个.NET示例应用程序(也有其他例子): https : //github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-oauth2-appidentity/blob/master/TodoListService/App_Start/ Startup.Auth.cs

该项目实际上还有一个客户端使用客户端凭据流调用API: https : //github.com/Azure-Samples/active-directory-dotnet-webapp-webapi-oauth2-appidentity/blob/master/TodoListWebApp/Controllers/ TodoListController.cs#L95 。

很抱歉这个冗长的答案,我想详细介绍一下:)

但请随意询问您是否对某些特定部分有疑问。