首页 > 解决方案 > 带有 OpenIdConnect 的 IIS 反向代理转到错误的身份提供程序

问题描述

OpenIdConnect (Azure) 设置

// COOKIES: Tells it to use cookies for authentication.
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions()
{
    CookieManager = new SystemWebCookieManager()
});

// OPEN-ID: Authenticate via Azure AD using OpenIdConnect.
//https://azure.microsoft.com/en-us/resources/samples/active-directory-dotnet-webapp-webapi-openidconnect/
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions()
{
    ClientId = ClientID,
    Authority = Authority,
    PostLogoutRedirectUri = PostLogoutRedirectUri,
    Notifications = new OpenIdConnectAuthenticationNotifications()
    {
        AuthenticationFailed = PrincipalService.OnAzureAuthenticationFailure,
        // REFERENCE: https://russellyoung.net/2015/09/05/mvc-role-based-authorization-with-azure-active-directory-aad/
        AuthorizationCodeReceived = (AuthorizationCodeReceivedNotification notification) =>
        {
            var username = notification.AuthenticationTicket.Identity.Name.Split('#').LastOrDefault();
            Logger.Log(Level.Auth, "Azure login success! Username: '" + username + "'.");
            return Task.FromResult(0);
        }
    }
});

ARR 网址重写设置

<rewrite>
    <outboundRules> 
        <preConditions> 
            <preCondition name="ResponseIsHtml1"> 
                <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" /> 
            </preCondition> 
        </preConditions> 
    </outboundRules>
    <rules>
        <rule name="Secondary Server" stopProcessing="true">
            <match url="(.*)" />
            <conditions>
                <add input="{CACHE_URL}" pattern="^(https?)://" />
            </conditions>
            <action type="Rewrite" url="https://qa2mobile.auntmillies.com/{R:1}" />
            <serverVariables>
            </serverVariables>
        </rule>
    </rules>
</rewrite>

问题

Azure AD 身份验证正常工作,但是一旦我设置了反向代理,它就会开始将我带到我自己的域,就好像它是身份提供者一样。

例如https://my.domain.com/<guid>/oauth2/authorize?client_id=<guid>&etc

这是什么原因造成的?我的意思是,显然是反向代理,但是如何在不删除反向代理的情况下修复它?

标签: azure-active-directoryreverse-proxyopenid-connectiis-8

解决方案


这是什么原因造成的?我的意思是,显然是反向代理,但是如何在不删除反向代理的情况下修复它?

据我所知,如果您在 web.config 中使用 url rewirte 规则,它会将所有请求重写到包含 login.microsoftonline.com的https://my.domain.com/域。

我建议您可以编写一个新规则,用于匹配 /oauth2 请求 url 以直接重定向到 login.microsoftonline.com 而不是https://my.domain.com/。然后它会很好地工作。

更多细节,你可以参考下面的 url 重写规则。

    <rewrite>
        <rules>
          <rule name="rule2" stopProcessing="true">
            <match url="<talentid>/oauth2/(.*)" />
            <action type="Redirect" url="https://login.microsoftonline.com/{R:0}" />
          </rule>
            <rule name="ReverseProxyInboundRule1" stopProcessing="true">
                <match url="(.*)" />
                <action type="Rewrite" url="https://<domain>.com/{R:1}" />

            </rule>
        </rules>
        <outboundRules>

            <preConditions>
                <preCondition name="ResponseIsHtml1">
                    <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
                </preCondition>
            </preConditions>
        </outboundRules>
    </rewrite>

推荐阅读