Azure active directory 使用Azure API管理转发的站点处理AAD登录
我有一个服务结构群集,它运行的服务(无状态ASP.Net核心)不能暴露于Internet。对服务的请求通过API管理路由Azure active directory 使用Azure API管理转发的站点处理AAD登录,azure-active-directory,azure-service-fabric,Azure Active Directory,Azure Service Fabric,我有一个服务结构群集,它运行的服务(无状态ASP.Net核心)不能暴露于Internet。对服务的请求通过API管理路由 Incoming request ==> https://blah.trafficmanager.net/routeName forwarded ==> https://10.0.4.6:[port]/routeName 这在没有身份验证的情况下可以正常工作。我正在连接AAD auth,因为我们需要将其锁定到客户端注册(由于时间框提升请求要求)。我已将服务设置为
Incoming request ==> https://blah.trafficmanager.net/routeName
forwarded ==> https://10.0.4.6:[port]/routeName
这在没有身份验证的情况下可以正常工作。我正在连接AAD auth,因为我们需要将其锁定到客户端注册(由于时间框提升请求要求)。我已将服务设置为使用AAD auth,在本地开发服务结构群集中运行时,使用以下参数可以正常工作(即提示登录,路由根据角色进行选通):
"AzureAd:ClientId": "[client id]",
"AzureAd:Domain": "[tenant].onmicrosoft.com",
"AzureAd:Instance": "https://login.microsoftonline.com/",
"AzureAd:SignedOutCallbackPath": "/signout-callback-oidc",
"AzureAd:CallbackPath": "/signin-oidc",
"AzureAd:TenantId": "[tenant id]",
当我部署它并尝试通过重定向点击它时,我最终得到:
以下是我的startup.cs代码:
/// <summary>
/// Configure services
/// </summary>
/// <param name="services">Service collection</param>
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpContextAccessor();
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.Unspecified;
// Handling SameSite cookie according to https://docs.microsoft.com/en-us/aspnet/core/security/samesite?view=aspnetcore-3.1
options.HandleSameSiteCookieCompatibility();
});
// Sign-in users with the Microsoft identity platform
services.AddMicrosoftWebAppAuthentication(this.Configuration);
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.All;
options.KnownProxies.Add(IPAddress.Parse("10.0.4.6"));
});
// services.AddControllers();
services.AddControllers(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
});
}
/// <summary>
/// Configure app
/// </summary>
/// <param name="app">App builder</param>
/// <param name="env">Environment</param>
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseDeveloperExceptionPage();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseForwardedHeaders();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
//
///配置服务
///
///服务收集
public void配置服务(IServiceCollection服务)
{
AddHttpContextAccessor();
配置(选项=>
{
//此lambda确定给定请求是否需要非必要cookie的用户同意。
options.checkApprovered=context=>true;
options.MinimumSameSitePolicy=SameSiteMode.Unspecified;
//根据标准处理SameSite cookiehttps://docs.microsoft.com/en-us/aspnet/core/security/samesite?view=aspnetcore-3.1
options.HandleSameSiteCookieCompatibility();
});
//使用Microsoft identity platform登录用户
AddMicrosoftWebAppAuthentication(this.Configuration);
配置(选项=>
{
options.ForwardedHeaders=ForwardedHeaders.All;
options.KnownProxies.Add(IPAddress.Parse(“10.0.4.6”));
});
//services.AddControllers();
services.AddControllers(选项=>
{
var policy=new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()文件
.Build();
options.Filters.Add(新的授权过滤器(策略));
});
}
///
///配置应用程序
///
///应用程序生成器
///环境
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
app.UseDeveloperExceptionPage();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseForwardedHeaders();
app.UseEndpoints(端点=>
{
endpoints.MapControllers();
});
}
我想知道我是否可以做些什么,使集群节点上的服务能够对通过APIM传入的请求进行身份验证
谢谢 我可以用以下内容覆盖回复url:
services.Configure<OpenIdConnectOptions>(
OpenIdConnectDefaults.AuthenticationScheme,
options =>
{
var redirectToIdpHandler = options.Events.OnRedirectToIdentityProvider;
options.Events.OnRedirectToIdentityProvider = async context =>
{
// Call what Microsoft.Identity.Web is doing
await redirectToIdpHandler(context);
// Override the redirect URI so that auth works behind APIM
context.ProtocolMessage.RedirectUri = this.Configuration["AzureAd:RedirectUri"];
};
});
服务。配置(
OpenIdConnectDefaults.AuthenticationScheme,
选项=>
{
var redirectToIdpHandler=options.Events.OnRedirectToIdentityProvider;
options.Events.OnRedirectToIdentityProvider=异步上下文=>
{
//调用Microsoft.Identity.Web正在执行的操作
等待重定向到DPHandler(上下文);
//重写重定向URI,以便auth在APIM后面工作
context.ProtocolMessage.RedirectUri=this.Configuration[“AzureAd:RedirectUri”];
};
});
然后我遇到了身份验证问题,因为它会多次返回,最后给出一个登录错误。我发现这是因为我的回复url指向主站点,而不是登录oidc。当我用APIM作为回复url添加signin oidc时,APIM失败了,因为并没有使用此名称的路由。我创建了一个新的API,将signin oidc转发到后端的同一路由
现在AAD的回复在signin oidc点击我的APIM,并在背面转发给相同的人。这允许auth完成。我可以用以下内容覆盖回复url:
services.Configure<OpenIdConnectOptions>(
OpenIdConnectDefaults.AuthenticationScheme,
options =>
{
var redirectToIdpHandler = options.Events.OnRedirectToIdentityProvider;
options.Events.OnRedirectToIdentityProvider = async context =>
{
// Call what Microsoft.Identity.Web is doing
await redirectToIdpHandler(context);
// Override the redirect URI so that auth works behind APIM
context.ProtocolMessage.RedirectUri = this.Configuration["AzureAd:RedirectUri"];
};
});
服务。配置(
OpenIdConnectDefaults.AuthenticationScheme,
选项=>
{
var redirectToIdpHandler=options.Events.OnRedirectToIdentityProvider;
options.Events.OnRedirectToIdentityProvider=异步上下文=>
{
//调用Microsoft.Identity.Web正在执行的操作
等待重定向到DPHandler(上下文);
//重写重定向URI,以便auth在APIM后面工作
context.ProtocolMessage.RedirectUri=this.Configuration[“AzureAd:RedirectUri”];
};
});
然后我遇到了身份验证问题,因为它会多次返回,最后给出一个登录错误。我发现这是因为我的回复url指向主站点,而不是登录oidc。当我用APIM作为回复url添加signin oidc时,APIM失败了,因为并没有使用此名称的路由。我创建了一个新的API,将signin oidc转发到后端的同一路由
现在AAD的回复在signin oidc点击我的APIM,并在背面转发给相同的人。这允许auth完成。我找到了github.com/AzureAD/microsoft-identity-web/issues/115,如果我用context.ProtocolMessage.RedirectUri覆盖reply_uri,我将获得所需的回复uri,可以访问并通过auth继续。我已登录,但出现“我们无法让您登录”错误(虽然对话框显示“已登录”,但显然只对MS,而不是我指定的客户端)。上面的链接谈到了这一点,后来说这是不推荐的,并使用转发头。这样做让我想到了最初的问题。我找到了github.com/AzureAD/microsoft-identity-web/issues/115,如果我用context.ProtocolMessage.RedirectUri覆盖reply_uri,我会得到所需的回复uri,可以访问并通过auth继续。我已登录,但出现“我们无法让您登录”错误(虽然对话框显示“已登录”,但显然只对MS,而不是我指定的客户端)。上面的链接谈到了这一点,后来说这是不推荐的,并使用转发头。那样做