2016-10-12 9 views
0

既存のWebフォームサイトをマルチテナント環境として構成しています。 1つの要件は、複数のクライアントADFSと統合できることです。 私はthis postに続き、複数のADFSをサポートするMVCアプリケーションを正常に実装しました。しかし、私はまだMVCアプリで再現できない問題 に直面しています。 Webフォームサイトでは、登録された最初のADFSプロバイダのみが成功します。 2番目は常に が認証され、自分のサイトに戻った後にSignatureVerificationFailedExceptionをスローします(例外は私の側で起こります)。 これは、私がOWINスタートアップコンフィギュレーションでapp.Map(...)またはapp.Use(...)を使用するかどうかにかかわらずです。
WebアプリケーションをWebアプリケーションに変換しようとしましたが、同じ結果になりました。私は、リクエストがWEB FORMSで処理される方法に関連していると思います。これはMVCとは異なります。

ミドルウェアのマッピングをいくつかの方法で処理する必要がありますか?
私は何が欠けていますか? ?
それともこれは...ここASP.NET Webフォームサイト - OWIN KATANAを使用した複数のADFSとの統合

は私OWINのスタートアップコンフィギュレーションであるすべてのことはできません。どんなに私は何をすべきか

context.GetOwinContext().Authentication.Challenge(
    new AuthenticationProperties { RedirectUri = callbackUrl }, 
    provider); 
response.StatusCode = 401; 
response.End(); 

、のみ:ここで

app.Properties["Microsoft.Owin.Security.Constants.DefaultSignInAsAuthenticationType"] = Config.ExternalAuthentication.Cookie; 
app.UseCookieAuthentication(new CookieAuthenticationOptions 
{ 
    AuthenticationType = Config.ExternalAuthentication.Cookie, 
    AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Passive 
}); 

string wreply = Config.ExternalAuthentication.Wreply; 
string wtrealm = Config.ExternalAuthentication.Wtrealm; 

List<Company> adfsCompanies = BL.GetCompaniesWithADFS(); 
app.Map("/Public/Login.aspx", configuration => 
{ 
    foreach (Company company in adfsCompanies) 
    { 
     //configure middleware 
     var middleware = new WsFederationAuthenticationOptions() 
     { 
      MetadataAddress = company.ADFSMetadataUrl, 
      AuthenticationType = company.TenantName, 
      Caption = company.Name, 
      Wreply = wreply, 
      Wtrealm = wtrealm, 
      BackchannelCertificateValidator = null 
     };  

     //add to pipeline 
     configuration.UseWsFederationAuthentication(middleware); 
    } 
}); 

は私のチャレンジ要求でありますどのADFSミドルウェアでも最初に登録されたミドルウェアは成功します。私はミドルウェアを別のパイプラインステージに接続しようとしましたが、成功しませんでした。

ありがとうございました!

答えて

1

複数のwsfedミドルウェアの場合、それぞれ固有のWsFederationAuthenticationOptions.CallbackPathを設定する必要があります。 "/ ws1"。また、この値をwreplyに含める必要があります。

+0

多くのおかげで、@ Tratcher。あなたの答えは完全な解決策ではありませんが、正しい方向に私を導きます。質問をきれいでシンプルに保つために、私はもう一つの答えでさらに詳細を述べます – Vladislav

0

私はちょうどクリーンでシンプルな疑問を維持するために、@Tratcherによって提案された解決策にはいくつかの詳細を与えている:

1)According to MSDNCallbackPathWreplyから計算されて設定されていない場合。

2)プロバイダごとにWreplyを識別した後、他の問題が発生したため、十分ではないことが判明しました。その後、私は(MVCの作業サンプルを使用して)さらにWtrealmWreplyの値が同じであることがわかりました。

3)ASP.NET Webフォームでプロバイダごとに異なるURLを設定するのは簡単ではないことが判明しました。偽のURLが機能しませんでした。 URLリライトを使用する - また。
最も簡単な解決策は、プロバイダごとに異なるコールバックページを使用することです(ExternalLoginFirstADFS.aspx、ExternalLoginSecondADFS.aspxなど)。これは、正常に動作しますが、最高ではないので、私はこのようなGlobal.asaxの中Application_Startイベントで、各プロバイダのルートを設定することにしました:

void Application_Start(object sender, EventArgs e) 
{ 
    ... 
    RegisterRoutes(System.Web.Routing.RouteTable.Routes); 
} 

public static void RegisterRoutes(System.Web.Routing.RouteCollection routes) 
{ 
    List<Organization> adfsCompanies = OrgElementEntity.GetCompaniesWithADFS(); 
    foreach(Organization company in adfsCompanies) 
    { 
     routes.MapPageRoute("", 
      String.Format("Public/ExternalLogin{0}.aspx", company.TenantName), 
      "~/Public/ExternalLogin.aspx"); 
    } 
} 

さらに、それはあまりにも使う必要がないことが判明しましたapp.Map(...)OwinStartupapp.UseWsFederationAuthentication(...)で各ミドルウェアを追加するだけで問題はないようです。

関連する問題