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

时间:2017-11-09 17:17:18

标签: c# azure azure-web-sites azure-active-directory asp.net-core-2.0

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

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

    更新 - 此处的InWeb Core 2.0身份验证设置:

    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()); });
    }
    

1 个答案:

答案 0 :(得分:5)

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

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

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

以下是一个示例应用角色:

"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的刀片,然后转到所需权限。

你必须去Add - >选择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-service#service-to-service-access-token-request

它看起来像这样:

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当然也必须验证令牌。这是一个.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

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

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