web-dev-qa-db-ja.com

子ドメインに対してOffice 365 ADFS認証が機能しない

会社がOffice 365をADFS認証で使用しています。 AD Connectはディレクトリ同期に使用され、ADFSはWindowsサーバー2012 R2バージョンです。

会社には複数のActive Directoryドメインがあります。

parent1.com
    child1.parent1.com
    child2.parent1.com
    child3.parent1.com
parent2.com
    ...
...

ルートドメインはOffice 365でフェデレーションドメインとして構成されます(パブリックドメイン名とADドメイン名は同じです)。これは正常に機能し、ユーザーは[email protected]などのUPNとADパスワードを使用してOffice 365にログインできます。

子ドメインのサポートを追加する必要があります。したがって、次のコマンドを実行してchild1.parent1.comをOffice 365に追加しました(Connect-MsolServiceを使用して管理者アカウントでOffice 365に接続した後):

New-MsolFederatedDomain -DomainName child1.parent1.com -SupportMultipleDomain

(注:SupportMultipleDomainパラメーターを使用しなかった場合、PowerShellはそれが必要であることを示すエラーを出します)。

次に、プライベートDNSとパブリックDNSの両方で、必要なすべてのDNSレコードを追加しました。 DNSレコードのOffice 365検証により、すべて問題ないことが報告されました。

その後、子ドメインがAD Connectに追加され、同期が実行されました。したがって、子ドメインのユーザーは、[email protected]などのユーザー名でOffice 365に表示されました。適切なライセンスを割り当てて、Office 365ポータルにログインしようとしました。

ただし、子ドメインのユーザーはログインできません。 「無効なリクエスト」エラーが表示され、次の詳細が追加されます。

Correlation ID: b1e47d45-b21c-42e9-9758-265804db7171 
Timestamp: 2016-08-10 20:27:48Z 
AADSTS50107: Requested federation realm
object 'http://child1.parent1.com/adfs/services/trust/' does not exist. 

ADFS側には明らかに何か問題がありますが、私はその専門家ではありません。また、それを設定したのも私ではありませんでした。子ドメインのユーザーがOffice 365に正常にログインできるように、これを修正するにはどうすればよいですか?

4
Massimo

問題はほとんど文書化されていません( Technetブログの投稿 および Azure ADのいくつかの文書 ))確かに存在し、特定の状況でADFSが正しく動作しないことが原因です(複数のトップレベルのフェデレーションドメインとフェデレーションされた子ドメインを混在させて);ソリューションには、ユーザーのUPNに関連付けられたIssuerUriを構築するために使用されるADFSクレームルールの正規表現を編集することが含まれます。 2番目の記事からの引用:

So lets say for example that I have bmcontoso.com and then add
corp.bmcontoso.com. This means that the IssuerUri for a user from
corp.bmcontoso.com will need to be http://bmcontoso.com/adfs/services/trust.
However the standard rule implemented above for Azure AD, will generate a
token with an issuer as http://corp.bmcontoso.com/adfs/services/trust
which will not match the domain's required value and authentication will fail.

この問題を解決するには、ADFSの3番目のクレームルールを編集する必要があります。

c:[Type == "http://schemas.xmlsoap.org/claims/UPN"] => issue(Type = "http://schemas.Microsoft.com/ws/2008/06/identity/claims/issuerid", Value = regexreplace(c.Value, ".+@(?<domain>.+)","http://${domain}/adfs/services/trust/"));

c:[Type == "http://schemas.xmlsoap.org/claims/UPN"] => issue(Type = "http://schemas.Microsoft.com/ws/2008/06/identity/claims/issuerid", Value = regexreplace(c.Value, "^((.*)([.|@]))?(?<domain>[^.]*[.].*)$", "http://${domain}/adfs/services/trust/"));

ただし、これにより、親ドメインがフェデレーションされていない実際の第3レベルのフェデレーションドメインなど、他のシナリオとの互換性が失われる可能性があることに注意してください。

3
Massimo