SSO 在本地工作,但不适用于将站点部署为另一个站点中的应用程序的环境

问题描述 投票:0回答:1

我已经为 .NET Core 应用程序设置了 Entra SSO,当部署到测试环境时,它在本地运行得非常好。当部署到上线时,该站点在 IIS 中设置为另一个站点中的应用程序。

测试网址: test.mysite.com/

update-my-data 是应用程序的实时网址:mysite.com/update-my-data

为了在本地进行测试,我在个人帐户上设置了一个租赁,并将“update-my-data”添加到启动设置中的应用程序 URL 中。

重定向 uri 是:

https://localhost:44357/update-my-data/signin-oidc

appsettings 中的回调路径为“/signin-oidc”。

到目前为止,这一切在本地和测试上都很完美。

在实时情况下,我可以在日志中看到用户已通过身份验证,但在身份验证后,他们并没有被定向到正确的页面,而是得到了 502,其中重定向 uri 显示在浏览器导航中。我是否需要执行任何其他操作才能获得当该网站作为另一个网站的应用程序时,这是否可以按预期工作?

来自 appsettings.json:

"AzureAd": {
    "ClientId": "xxxxxxxx",
    "ClientSecret": "yyyyyyyyyyyyy",
    "Authority": "https://login.microsoftonline.com/zzzzzzzzz",
    "CallbackPath": "/signin-oidc",
    "AppsEditorGroup": "editor",
    "RemEditorGroup": "editor"
},

azure 上的重定向 uri: https://my.site.com/update-my-data/signin-oidc 成功 SSO 身份验证后,此 URL 也会出现在浏览器导航中 - 我检查了日志中的 SSO 结果。

SSO 在此启动:

[Route("login")]
public IActionResult Login()
{
    try
    {
       
        return RedirectToAction("home", "accounts");
        
    }
    catch (Exception ex)
    {
        Log.Error(ex, "SSO Error - Exception during authentication: " + ex.Message);
        return BadRequest();
    }
}

我的程序中有这个。cs

builder.Services.AddIdentity<IdentityUser, IdentityRole>(options =>
    {
        options.SignIn.RequireConfirmedAccount = false; // Adjust according to your needs
    })
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

// Configure authentication with separate cookie authentication for Identity
builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = OpenIdConnectDefaults.AuthenticationScheme; // Use SSO as default
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; // Force SSO as the default challenge
    options.DefaultSignInScheme = OpenIdConnectDefaults.AuthenticationScheme; // Ensure cookies are not signed in
})
.AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
.EnableTokenAcquisitionToCallDownstreamApi()
.AddMicrosoftGraph(builder.Configuration.GetSection("Graphv1"))
.AddInMemoryTokenCaches();
.
.
.
builder.Services.AddControllersWithViews(options =>
{
    var policy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .Build();
    options.Filters.Add(new AuthorizeFilter(policy));
});
azure-active-directory single-sign-on openid-connect microsoft-entra-id
1个回答
0
投票

该问题似乎与当您的应用程序作为另一个站点中的应用程序部署在 IIS 中时如何解析和处理重定向 URI 有关。检查和调整的要点如下:


1. 确保正确的重定向 URI 配置

您需要确保在Azure中注册的重定向URI与实际环境结构完全匹配。对于您的现场设置:

  • 在 Azure 中注册重定向 URI:

确保此 URI 列在 Azure 应用程序注册中的身份验证 > 重定向 URI下。


2. IIS 中的基本路径问题

当您的应用程序作为应用程序托管在另一个站点中时,IIS 可能无法正确解析您的应用程序的基本路径。更新

CallbackPath
中的
appsettings.json
以包含应用程序基本路径:

"CallbackPath": "/update-my-data/signin-oidc"

然后,在您的 Azure 应用程序注册中,确保重定向 URI 与上面完全匹配。


3. 正确的 IIS 重写规则(如果适用)

如果您的 IIS 设置使用重写规则,请确保它们正确处理对

signin-oidc
端点的请求。例如,确保
/update-my-data/signin-oidc
未被剥离或错误重定向。

您可能需要添加以下规则以确保

signin-oidc
回调正确传递:

<rule name="OIDC Callback" stopProcessing="true">
    <match url="^update-my-data/signin-oidc$" />
    <conditions logicalGrouping="MatchAll" />
    <action type="None" />
</rule>

4. .NET Core 中的基本路径感知

当您的应用程序部署为 IIS 中的子应用程序时,

.NET Core
可能不知道应用程序的基本路径 (
/update-my-data
)。这可能会导致生成不正确的路径。

Program.cs
中,添加此中间件来修复基本路径:

app.UsePathBase("/update-my-data");
app.Use(async (context, next) =>
{
    context.Request.PathBase = "/update-my-data";
    await next.Invoke();
});

这可确保您的应用程序正确处理前缀为

/update-my-data
的路由。


5. 设置正确的注销和登录后重定向

在您的 Azure 配置和

.NET
代码中,显式设置登录后和注销重定向 URI 以匹配实时环境:

"AzureAd": {
    ...
    "CallbackPath": "/update-my-data/signin-oidc",
    "SignedOutCallbackPath": "/update-my-data/signout-callback-oidc"
}

6. 记录和调试

启用更详细的日志来查明问题:

builder.Services.Configure<OpenIdConnectOptions>(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
    options.Events.OnRedirectToIdentityProvider = context =>
    {
        Log.Information("Redirecting to identity provider with URI: " + context.ProtocolMessage.RedirectUri);
        return Task.CompletedTask;
    };
    options.Events.OnAuthenticationFailed = context =>
    {
        Log.Error(context.Exception, "Authentication failed.");
        return Task.CompletedTask;
    };
});


### 7. **Check IIS Hosting Setup**
Double-check that the IIS site is configured to pass requests correctly to the
© www.soinside.com 2019 - 2024. All rights reserved.