Hallo Blogleser, Microsoft hat bekanntlich das Service Pack 1 für Exchange Server 2013 veröffentlicht. Neben den großen Highlights wie MAPI over HTTP ist auch die Native Unterstützung für ADFS mitgekommen. Im vergangenem Beitrag habe ich bereits über die Veröffentlichung von Exchange 2013 mit WAP berichtet und versprochen diesen Artikel Zeitnah zu veröffentlichen.
Nun will ich meine Umgebung ein wenig „aufmotzen“. Zunächst habe ich auf meinem Exchange Server 2013 das SP 1 installiert, wisst Ihr ja bereits (Transportdienst Fehler). Anschließend habe ich sichergestellt das meine Veröffentlichung über WAP weiterhin einwandfrei funktioniert, tut es natürlich :) Nun geht es damit weiter eine „Vertrauensstellung der Vertrauenden Seite (Add Relaying Party Trust Wizard) für OWA im AD FS zu erstellen. Heute arbeite ich Hauptsächlich mit der Power Shell, weil es einfach einfach ist :) Im Bild sieht man nochmal den Aufbau der Umgebung.
Ich habe lange Zeit benötigt um die AD FS Implementierung lauffähig zu bringen. Der TechNet-Artikel von Microsoft ist einfach Falsch, es funktioniert bis dato bei mir nicht obwohl ich es genau so durchgeklickt habe. Anfangs hatte ich Schwierigkeiten mit der Umsetzung der Benutzerdefinierten Regeln und den Ansprüchen. Da ich alles einige mal versucht habe, ist das Script entstanden, ich hoffe es hilft Euch! Für diejenigen die sich selbst am Artikel vom TechNet versuchen wollen: http://technet.microsoft.com/en-us/library/dn635116(v=exchg.150).aspx.
Viel Spaß bei der kommenden Umsetzung.
Schritt 1 – Informationen auslesen
Wichtig für die Konfiguration, da wir die Zertifikats-Thumbprints benötigen, den ADFS-Issuer, die OWA & ECP Website. In meinem Beispiel ist dies zwar klar, allerdings möchte ich kurz erörtern wie mit Hilfe der Power Shell die Informationen ausgelesen werden können.
- OWA & ECP Url auslesen, dazu am Exchange-Server anmelden und die EMS öffnen
-
Get-OwaVirtualDirectory | ft name,externalurl
-
Get-EcpVirtualDirectory | ft name,externalurl
-
- Zertifikat am WAP-Server finden ( bei mir das Wildcard-Zertifikat) (Bild 1)
-
dir cert:localmachine\my
-
- Zertifikat am ADFS-Server finden (Token-Signing) (Bild 2)
-
Get-AdfsCertificate -CertificateType "Token-Signing" | ft certificatetype,thumbprint
-
- ADFS-Url finden (Bild 3)
-
Get-AdfsProperties | ft hostname,FederationPassiveAddress
-
Damit habe ich folgende Informationen:
- owa (Default Web Site) = https://mail.sichel.com/owa
- ecp (Default Web Site) = https://mail.sichel.com/ecp
- Thumbprint WAP-Server = B2D96D09F600EB701ECC0F9265A33207BD137D4B
- Token-Signing ADFS-Server = F59567CD210DF68E745F4EC4FD6A1F60D1372044
- ADFS-Host = adfs.sichel.com/adfs/ls/
Schritt 2 – ADFS Anpassung
Um mit den Informationen aus Schritt 1 arbeiten zu können, ist ein Power Shell Script hilfreich. Es ist einfacher die Regeln im ADFS mit der PowerShell zu setzen als diese manuel zu klicken. Zumal die Regeln auf jedem System Identisch sind, mal abgesehen von den URLs & Zertifikaten.
Ein kleines Script hilft mir nun:
$OWA = "https://mail.sichel.com/owa" $ECP = "https://mail.sichel.com/ecp" $AusstellerRegel=@' @RuleTemplate = "AllowAllAuthzRule" => issue(Type = "http://schemas.microsoft.com/authorization/claims/permit", Value = "true"); '@ $AnspruchsRegel=@' @RuleName = "ActiveDirectoryUserSID" c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"] => issue(store = "Active Directory", types = ("http://schemas.microsoft.com/ws/2008/06/identity/claims/primarysid"), query = ";objectSID;{0}", param = c.Value); @RuleName = "ActiveDirectoryGroupSID" c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"] => issue(store = "Active Directory", types = ("http://schemas.microsoft.com/ws/2008/06/identity/claims/groupsid"), query = ";tokenGroups(SID);{0}", param = c.Value); @RuleName = "ActiveDirectoryUPN" c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"] => issue(store = "Active Directory", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"), query = ";userPrincipalName;{0}", param = c.Value); '@ Add-ADFSRelyingPartyTrust -Name "Outlook Web App" -Enabled $true -Notes "Vertrauensstellung für $OWA" -WSFedEndpoint $OWA -Identifier $OWA -IssuanceTransformRules $AnspruchsRegel -IssuanceAuthorizationRules $AusstellerRegel Add-ADFSRelyingPartyTrust -Name "Exchange Systemsteuerung" -Enabled $true -Notes "Vertrauensstellung für $ECP" -WSFedEndpoint $ECP -Identifier $ECP -IssuanceTransformRules $AnspruchsRegel -IssuanceAuthorizationRules $AusstellerRegel Write-host "ADFS Konfiguration ausgeführt."
Damit habe ich nun die Vertrauensstellungen im ADFS hinzugefügt (Bild 4), diese enthalten die Anspruchsregeln (Bild 5). In diesen sind dann die Benutzerdefinierten Regeln zu finden (Bild 6).
Schritt 3 – WAP anpassen
Nachdem also ADFS angepasst ist, und das ging mit dem PS-Script deutlich einfacher :), fahre ich mit dem Scripting fort. Auch den Webanwendungsproxy bearbeite ich nun mit der guten jungen „Kraftmuschel“. Es müssen zwei neue Regeln hinzugefügt werden, basierend auf den neuen Vertrauensstellungen aus Schritt 2. Es ist das Identische Verfahren wie im ersten Beitrag zu WAP, halt nur mit der Shell. Wichtig ist, sollten hier noch die Regeln aus meinem vorherigen Beitrag existieren, müssen diese gelöscht werden. Diese beziehen sich noch auf die „alte“ Vertrauensstellung!!!
$WAPCert = "B2D96D09F600EB701ECC0F9265A33207BD137D4B" $OWA = "https://mail.sichel.com/owa" $ECP = "https://mail.sichel.com/ecp" Add-WebApplicationProxyApplication -BackendServerUrl "$OWA/" -ExternalCertificateThumbprint $WAPCert -ExternalUrl "$OWA/" -Name 'OWA Sichel' -ExternalPreAuthentication ADFS -ADFSRelyingPartyName 'Outlook Web App' Add-WebApplicationProxyApplication -BackendServerUrl "$ECP/" -ExternalCertificateThumbprint $WAPCert -ExternalUrl "$ECP/" -Name 'ECP Sichel' -ExternalPreAuthentication ADFS -ADFSRelyingPartyName 'Exchange Systemsteuerung' Write-host "WAP Regeln erfolgreich hinzugefügt"
Damit sind die neuen regeln auch schon hinterlegt :) (Bild 7)
Schritt 4 – Exchange Server anpassen
Damit die Exchange Organisation auch mit unseren ADFS-Tokens umgehen kann, muss dieser sich auf den ADFS-Austeller einspielen, dies ist eine Organisationskonfiguration, gilt also für alle Exchange Server. Dafür muss ich mich mal wieder der Shell bemühen, eine GUI für die Umsetzung existiert nicht. Zudem muss die Authentifizierungsart der Virtuellen Verzeichnisse umgestellt werden, so dass diese ausschließlich ADFS akzeptieren.
Achtung, sollten folgende Befehle in einer *.ps1 Datei hinterlegt werden, diese mit der EMS öffnen und nicht mi der „normalen“ Power Shell.
$OWA = "https://mail.sichel.com/owa" $ECP = "https://mail.sichel.com/ecp" $ADFSSigningCert = "F59567CD210DF68E745F4EC4FD6A1F60D1372044" $ADFSUrl="https://adfs.sichel.com/adfs/ls/" $URLs = @($OWA,$ECP) Set-OrganizationConfig -AdfsIssuer $ADFSUrl -AdfsAudienceUris $URLs -AdfsSignCertificateThumbprint $ADFSSigningCert Write-host "Exchange Organisationskonfiguration erfolgreich" Get-EcpVirtualDirectory | Set-EcpVirtualDirectory -AdfsAuthentication $true -BasicAuthentication $false -DigestAuthentication $false -FormsAuthentication $false -WindowsAuthentication $false Get-OwaVirtualDirectory | Set-OwaVirtualDirectory -AdfsAuthentication $true -BasicAuthentication $false -DigestAuthentication $false -FormsAuthentication $false -WindowsAuthentication $false Write-host "Exchange Server Virtuelle Verzeichnisse erfolgreich konfiguriert, IIS Neustart bitte nicht vergessen"
Anschließend noch die IIS-Dienste neu starten (iisreset /noforce).
Nun kann ich mir mit Hilfe der Befehle
Get-OwaVirtualDirectory | fl *auth* Get-EcpVirtualDirectory | fl *auth*
die Authentifizierungskonfiguration ansehen (Bild 8). Der Befehl
Get-OrganizationConfig | fl *ADFS*
zeigt mir die neue Organisationskonfiguration an (Bild 9).
Schritt 5 – Testen
Anschließend kann ich mich sowohl von intern als auch von Extern am Exchange anmelden. Ich werde immer zum ADFS umgeleitet um meine Benutzerdaten einzugeben. Das schöne ist, beim Abmelden bekomme ich nun nicht mehr die Meldung: „Schließen Sie das Browserfenster“ sondern ich werde vollständig abgemeldet und zu der ADFS Website umgeleitet (Bild 10).
Wie üblich alle Bilder in der Übersicht.
Funktioniert die OWA Abmeldung mit der ADFS Authentifizierung wie bei der Form based authentication oder muss wieder der Browser geschlossen werden?
Hey ;)
wird die Authentifizierung über ADFS, wie im Artikel beschrieben, so wird die Abmeldung auch an den ADFS-Server übergeben.
PS: Der Artikel ist nun wieder vollständig!
Andi
Hello Andi… Any suggestion in my case…???
Hey Aman,
have you set the delegation trust settings on ad object from wap server?
Andi
Yes, I have already done it….. But it did not work….
Hello Andi Sickle.. First of all big thanks for making this integration so simple using powershell commands….
Secondly, this works not well for me… All the commands executed successfully but at last when i am trying to open owa or ecp URL, I am getting the following error. I have tried a lot but I am not able to solve this.
Firstly I was thinking, there is some issue in IIS due to which this message occurred, but its not that because If I will reset the virtual directories on exchange server, both the URLs start working and accept both form based and windows authentication methods.
Please help me… I have my lab environment at office where I am doing this…
Server Error in ‚/owa‘ Application.
ID0006: The input string parameter is either null or empty.
Parameter name: value
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.ArgumentException: ID0006: The input string parameter is either null or empty.
Parameter name: value
Source Error:
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
Stack Trace:
[ArgumentException: ID0006: The input string parameter is either null or empty.
Parameter name: value]
Microsoft.IdentityModel.Web.CookieHandler.set_Path(String value) +1103025
Microsoft.Exchange.Security.Authentication.AdfsSessionAuthModule.InitializeModule(HttpApplication application) +543
System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext context, MethodInfo[] handlers) +530
System.Web.HttpApplication.InitSpecial(HttpApplicationState state, MethodInfo[] handlers, IntPtr appContext, HttpContext context) +304
System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext, HttpContext context) +404
System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +475
[HttpException (0x80004005): ID0006: The input string parameter is either null or empty.
Parameter name: value]
System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +12617668
System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +159
System.Web.HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +12457285
Hi,
have you imported the adfs signing certificat to trustedt root certificate store on Exchange CAS server?
Andi
Das Script funktioniert nicht, weill die Ansicht dieser Seite völlig verrissen ist.
Ich schlage vor du teilst das Script in mehrere Kleinschritte auf, ansonsten kann ja keiner dein zusammengesetztes Script nur im Ansatz verstehen.
Hallo Reto,
wenn Du mit der Maus über den Script-Editor fährst kannst Du oben rechts den Code kopieren oder die Quelle einsehen. Somit lässt sich das Skript wunderbar in die ISE einfügen :)
Andi
Es funktioniert nicht. Ich bekomme nur Fehlermeldungen wegen einem unerlaubten Zeichen.
Ich habe es gerade eben erneut kopiert, eingefügt und klappte sofort. Arbeitest Du mit der ISE ?
Ok im ISE Editor hat es funktioniert. Danke dir.
Ja gerne! Viel Erfolg weiterhin bei der Umsetzung! Ach ja: „Die Seite ist nicht ‚verrissen'“ :) ! Andi
[…] Wichtig ist der “Thumbprint” da ich das Zertifikat mit netsh an den Port 443 binden muss. Ähnlich wie hier: Exchange 2013 SP1 und ADFS Authentifizierung (Accept ADFS Claims). […]
[…] Exchange 2013 SP1 und ADFS Authentifizierung (Accept ADFS Claims) […]
[…] Dieser Beitrag bezieht sich auf Exchange 2013 SP1 und ADFS Authentifizierung (Accept ADFS Claims) […]