Nextcloud Talk hinter IIS Proxy - Anmeldung nicht möglich

Hallo zusammen,

ich bin schier am verzweifeln. Ich bekomme es einfach nicht hin Nextcloud Talk hinter einem IIS Proxy ans laufen zu kriegen.

ZunĂ€chst hatte ich das Problem, dass bei der Anmeldung der “Zugriff gewĂ€hren” Button in der App ohne Funktion war. Das konnte ich mit Hilfe von dieser Anleitung lösen: https://docs.microsoft.com/de-de/archive/blogs/friis/setup-iis-with-url-rewrite-as-a-reverse-proxy-for-real-world-apps

Nun kann ich auf den Button klicken, in der Nextcloud selbst wird auch unter Sicherheit ein neues GerĂ€t registriert. In der App dreht sich dann ewig der Kreis und wird quittiert mit der Meldung “Nextcloud Talk App nicht auf dem Server installiert, Abbruch”. Irgendwo scheint eine Antwort zu fehlen, die von der Nextcloud nicht durch den Proxy ans GerĂ€t zurĂŒckgeschickt wird. Das interessante: Wenn ich eine direkte Portweiterleitung an meine Nextcloud ĂŒber einen anderen Port (444) mache, kann ich mich anmelden, Talk selbst lĂ€uft also ordentlich und ist auch installiert.

Hier meine Konfiguration:

Server: Dell Tower, Nextcloud in Hyper-V Umgebung
Haupbetriebssystem: Windows Server 2019, Version 1809 Build 17763.2928
Internet Information Services Version 10.0-17763.1
Nextcloud Version 24.0.1 auf Debian bullseye 11.3 und Apache
Talk App 14.0.2 auf einem Samsung Galaxy A51 mit Android 12
PHP Version 8.0
Datenbank MariaDB
Router FritzBox 7590 mit neuster Software

Das Problem war noch nie gelöst. Zuletzt habe ich die unzĂ€hligen Outbound-Rules im IIS angelegt, daher poste ich mal meine Config-Datei vom IIS, ich vermute dort den Fehler. Gibt es noch weitere Protokolle außer Java, href, src links, die evtl. umgeschrieben werden mĂŒssen?

In den Logs habe ich geschaut, Nextcloud und Apache liefern keine Fehler. Im IIS und Windows Server auch keine EintrĂ€ge, die auf einen Fehler hindeuten. Ich weiß nicht mehr wo ich noch suchen soll -.- Hoffentlich kann mir jemand helfen! Ich bin gerne Bereit zu teste und zu untersuchen, ich habe aber keinen Ansatz mehr wo ich nachschauen sollte. Wenn Informationen fehlen bitte kurz Bescheid geben!

web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <outboundRules>
                <clear />
                <rule name="ReverseProxyOutboundRule1" preCondition="ResponseIsHtml1">
                    <match filterByTags="A, Area, Base, Form, Frame, Head, IFrame, Img, Input, Link, Script" pattern="^http(s)?://LocalIP/(.*)" />
                    <conditions logicalGrouping="MatchAll" trackAllCaptures="true" />
                    <action type="Rewrite" value="http{R:1}://mydomain.com/{R:2}" />
                </rule>
                <rule name="RestoreAcceptEncoding" preCondition="NeedsRestoringAcceptEncoding" enabled="true">
                    <match serverVariable="HTTP_ACCEPT_ENCODING" pattern="^(.*)" />
                    <conditions logicalGrouping="MatchAll" trackAllCaptures="true" />
                    <action type="Rewrite" value="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" />
                </rule>
                <rule name="aTag" preCondition="NeedsRestoringAcceptEncoding" enabled="true">
                    <match filterByTags="None" pattern="href=(.*?)https://LocalIP/(.*?)\s" />
                    <action type="Rewrite" value="href={R:1}https://mydomain.com/{R:2}" />
                </rule>
                <rule name="action" preCondition="NeedsRestoringAcceptEncoding" enabled="true">
                    <match filterByTags="None" pattern="action=(.*?)http(s)?://LocalIP/(.*?)\\" />
                    <action type="Rewrite" value="href={R:1}https://mydomain.com/{R:2}" />
                </rule>
                <rule name="ReverseProxyOutboundRule2" preCondition="ResponseIsHtml2" enabled="false">
                    <match filterByTags="A, Form, Img" pattern="^http(s)?://LocalIP/(.*)" />
                    <action type="Rewrite" value="http{R:1}://mydomain.com/{R:2}" />
                </rule>
                <rule name="SRC" preCondition="NeedsRestoringAcceptEncoding">
                    <match filterByTags="None" pattern="src=(.*?)https://LocalIP/(.*?)" />
                    <action type="Rewrite" value="src={R:1}https://mydomain.com/{R:2}" />
                </rule>
                <preConditions>
                    <preCondition name="ResponseIsHtml1">
                        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/(.+)" />
                        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
                    </preCondition>
                    <preCondition name="NeedsRestoringAcceptEncoding">
                        <add input="{HTTP_X_ORIGINAL_ACCEPT_ENCODING}" pattern=".+" />
                    </preCondition>
                    <preCondition name="ResponseIsHtml2">
                        <add input="{RESPONSE_CONTENT_TYPE}" pattern="^text/html" />
                    </preCondition>
                </preConditions>
            </outboundRules>
            <rules>
                <clear />
                <rule name="ReverseProxyInboundRule1" enabled="true" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions logicalGrouping="MatchAll" trackAllCaptures="false" />
                    <serverVariables>
                        <set name="HTTP_X_ORIGINAL_ACCEPT_ENCODING" value="{HTTP_ACCEPT_ENCODING}" />
                        <set name="HTTP_ACCEPT_ENCODING" value="" />
                    </serverVariables>
                    <action type="Rewrite" url="http://LocalIP/{R:1}" />
                </rule>
                <rule name="Redirect to HTTPS" enabled="true" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
                        <add input="{HTTPS}" pattern="^OFF$" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" redirectType="SeeOther" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

Hey @Billyxx
vorweg, ich habe absolut keine Erfahrung mit IIS als ReverseProxy. Vielleicht hilft es dir, wenn du dir mal anschaust, wie der Login Flow in Nextcloud funktioniert (siehe https://docs.nextcloud.com/server/latest/developer_manual/client_apis/LoginFlow/index.html). Im Prinzip wird nach dem Login ein Redirect gemacht, um username und password zurĂŒckzugeben (nc://login/server:...). Könnte es sein, dass der IIS damit ein Problem hat oder das falsch zurĂŒckliefert?

Andere Überlegung: Was passiert wenn du temporĂ€r direkt auf Nextcloud verweist (statt auf den IIS) und dann den Account anlegst (sollte ja funktionieren, so wie du geschrieben hast). Funktioniert der angelegte Account dann immernoch, wenn du den IIS wieder zwischenschaltest?

Hey @SysKeeper
Herzlichen Dank fĂŒr deinen Input. So einen Login Flow habe ich gesucht, ich lese mir das mal durch und versuche damit weiterzukommen, vielen Dank! Wird vermutlich am Wochenende sein, da aktuell viele User angemeldet sind :wink:
Auch deinen zweiten Ansatz verstehe ich und diesen werde ich testen. Damit finde ich zumindest raus, ob es nur bei der Authentifizierung schief lÀuft oder dauerhaft etwas nicht weitergeleitet wird.
Ich melde mich wieder, wenn ich beides gelesen und ausprobiert habe!

Viele GrĂŒĂŸe!

Update: Lege ich die Portfreigabe direkt auf die Nextcloud via Port 443, klappt die Authorisierung. Ändere ich das dann wieder zurĂŒck durch den Proxy bleibt die Verbindung bestehen. Ich kann Nachrichten senden und empfangen, hab es soeben ausprobiert. Also muss das vermutlich mit dem nc-link zusammenhĂ€ngen. Endlich habe ich mal wieder eine Idee, wohin ich recherchieren kann. Wenn ich den notwendigen Outbound-Eintrag zusammen gebastelt habe poste ich die Lösung. Das muss die Ursache sein, da bin ich mir ziemlich sicher!