.Net核心2.0和多种身份验证方案

时间:2018-04-23 23:01:25

标签: asp.net-core .net-core adal

我们在Azure PaaS(AppService)中托管了一个现有的ASP.NET Core 2.0 Web App。我们成功使用OpenID Connect通过Azure AD对我们的企业用户进行身份验证。

现在我们想要几个内部部署的无头.NET批处理作业,它们使用应用程序身份验证来调用应用程序中的各种服务/ URL。

如果我们的一个客户端应用程序需要Azure门户中的权限并授予权限,我们会在Azure租户中向清单添加应用程序角色。我们只使用一个租户。

我们正在寻找有关需要修改的内容的指南,以便使用应用程序客户端ID + secret添加对无头批处理客户端应用程序身份验证的支持。

我对.AddOpenIdConnect的问题是:是否需要指定受众群体? ResponseType是否需要设置为不同的东西?

来自appsettings.json:

"Authentication": {
    "AzureAd": {
      "AADInstance": "https://login.microsoftonline.com/",
      "CallbackPath": "/signin-oidc",
      "ClientId": "c2141xxx-xxxx-xxxx-xxxx-xxxxxx76fd75",
      "Domain": "xxxxxxxxx.onmicrosoft.com",
      "TenantId": "311cxxxx-xxxx-xxxx-xxxx-xxxxxx8f8604",
      "ClientSecret": "************************",
      "Instance": "https://login.microsoftonline.com/"
    }
}

来自startup.cs:

services.AddAuthentication(
options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
    {
        options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.ClientId = Configuration["Authentication:AzureAd:ClientId"];
        options.ClientSecret = Configuration["Authentication:AzureAd:ClientSecret"];
        options.Authority = Configuration["Authentication:AzureAd:AADInstance"] + Configuration["Authentication:AzureAd:TenantId"];
        options.CallbackPath = Configuration["Authentication:AzureAd:CallbackPath"];
        options.ResponseType = OpenIdConnectResponseType.IdToken;
        options.GetClaimsFromUserInfoEndpoint = true;
        options.TokenValidationParameters = new TokenValidationParameters
        {
            RoleClaimType = "roles"
        };
        options.Events = new OpenIdConnectEvents()
        {
            OnRemoteFailure = OnAuthenticationFailed,
            OnRedirectToIdentityProvider = OnRedirectToIdentityProvider,
        };
    });

在客户端应用程序端,我们使用最新的ADAL NuGet包来获取应用程序的客户端应用程序ID +机密的持有者令牌,并将持有者令牌包含在应用程序的HTTP请求的授权头中。令牌中列出了正确的角色和目标受众。

据我所知,客户端的一切都是正确的,并在Azure中正确配置。问题似乎出现在ASP.NET Core 2.0服务应用程序的代码和/或配置中。

1 个答案:

答案 0 :(得分:0)

对于无头的客户,我建议使用JwtBearer。您可以使用默认的Microsoft配置,添加使用不同身份验证选项(如果使用Azure Ad或Office365,可以使用工作或学校帐户)添加网络核心Web API时可以找到的所有配置

services.AddAuthentication(options =>
            {
                options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
            })
           .AddAzureAdBearer(options => _configuration.Bind("AzureAd", options));