在ASP.NET Core 2.0中从另一个(无用户交互)授权一个应用程序服务
我在面向Internet(PubWeb)的Azure中有一个Web API应用程序,因此它可以在任何地方使用。 我创建了一个Web API(再次,在Azure中,我们称之为InWeb)。 我想要强有力的安全规则:
- InWeb必须仅由PubWeb使用。 这可能涉及一些网络安全 – 这是一个简单的部分(在Azure中)。
- 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 。
很抱歉这个冗长的答案,我想详细介绍一下:)
但请随意询问您是否对某些特定部分有疑问。
- .net-core-2.0 azure app service 502.5错误
- 从.net标准库中读取appsettings.json
- 启动时没有加载Automapper配置文件?
- 为什么AntiForgeryTokenvalidation会失败?
- 无法获取DbContext的reflection类型
- ASP.Net MVC核心2 – 区域路由
- 如何在aspnet.core web api中validationJWT令牌?
- 如何unit testingHttpContext.SignInAsync()?
- asp.net core 2.0中System.Web.Hosting.HostingEnvironment.RegisterObject的替代方案