我在面向互联网(PubWeb)的Azure中有一个Web API应用程序,因此可以在任何地方使用它。我创建了一个Web API(再次,在Azure中,让我们称之为InWeb)。我想要强有力的安全规则:
那么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()); });
}
答案 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。
很抱歉这个冗长的答案,我想详细介绍一下:)
但请随意询问您是否对某些特定部分有疑问。