Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure active directory 使用Azure API管理转发的站点处理AAD登录_Azure Active Directory_Azure Service Fabric - Fatal编程技术网

Azure active directory 使用Azure API管理转发的站点处理AAD登录

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,因为我们需要将其锁定到客户端注册(由于时间框提升请求要求)。我已将服务设置为

我有一个服务结构群集,它运行的服务(无状态ASP.Net核心)不能暴露于Internet。对服务的请求通过API管理路由

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,而不是我指定的客户端)。上面的链接谈到了这一点,后来说这是不推荐的,并使用转发头。那样做