2016-10-12 5 views
0

Я настраиваю старый существующий веб-сайт в качестве среды с несколькими арендаторами. Одним из требований является возможность интеграции с несколькими клиентскими ADFS. Я следовал this post и успешно реализовал приложение MVC, поддерживающее несколько ADFS. Однако я все еще сталкиваюсь с проблемой, , которая не воспроизводится приложением MVC. На моем веб-сайте успешно зарегистрирован только первый зарегистрированный поставщик ADFS. Второй всегда выдает SignatureVerificationFailedException после аутентификации и возврата на мой сайт (исключение происходит на моей стороне). Это независимо от того, использую ли я app.Map (...) или app.Use (...) в конфигурации запуска OWIN.
Я попытался преобразовать свой веб-сайт в веб-приложение, но тот же результат. Я думаю, что это связано с тем, как запросы обрабатываются в WEB FORMS, который отличается от MVC.

Должен ли я обрабатывать сопоставление промежуточного ПО каким-то другим способом?
Что мне не хватает?
Или это вообще невозможно ...Сайт веб-форм ASP.NET - интеграция с несколькими ADFS с использованием OWIN KATANA

Вот моя конфигурация запуска Owin:

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); 
    } 
}); 

Здесь пока мой запрос задача:

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

Независимо от того, что я делаю, только первое зарегистрированное промежуточное ПО ADFS будет успешным, независимо от того, какой из них. Я также попытался привязать средние к различным этапам трубопровода без успеха.

Заранее благодарим за любую помощь!

ответ

1

Для множественного промежуточного программного обеспечения wsfed каждый должен установить уникальный WsFederationAuthenticationOptions.CallbackPath, например. "/ Ws1". Вам также нужно будет включить это значение в wreply.

+0

Большое спасибо, @Tratcher. Ваш ответ не дает полного решения, но он ведет меня в правильном направлении. Я дам более подробную информацию с еще одним ответом, чтобы вопрос был чистым и простым – Vladislav

0

Я просто дать некоторые детали к решению предложенной @Tratcher для того, чтобы держать вопрос чистой и простой:

1) According to MSDN, CallbackPath если не установлен рассчитывается из Wreply;

2) после отличия Wreply для каждого провайдера оказалось, что этого было недостаточно, потому что возникли другие проблемы. Затем я нашел (используя рабочий образец MVC), что, кроме того, Wtrealm и Wreply должны иметь одинаковое значение;

3) Настройка различных URL-адресов для разных поставщиков в ASP.NET Web Forms оказалась не такой простой. Поддельные URL-адреса не работают. Использование URL Rewrite - также.
Наиболее простым решением является использование другой страницы обратного вызова для каждого провайдера (например, ExternalLoginFirstADFS.aspx, ExternalLoginSecondADFS.aspx, ...). Это, хотя и работает нормально, это не самый лучший, поэтому я решил настроить маршрут для каждого поставщика на Application_Start события в Global.asax, как это:

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(...) по адресу OwinStartup. Просто добавление каждого промежуточного программного обеспечения через app.UseWsFederationAuthentication(...) кажется прекрасным!

Смежные вопросы