2016-10-12 6 views
0

기존의 기존 웹 폼 사이트를 다중 사용자 환경으로 구성하고 있습니다. 하나의 요구 사항은 여러 클라이언트 ADFS와 통합 할 수 있어야한다는 것입니다. 나는 this post을 따라 갔으며 여러 ADFS를 지원하는 MVC 응용 프로그램을 성공적으로 구현했습니다. 그러나 여전히 MVC 애플 리케이션과 함께 재현 할 수없는 문제가 발생합니다. 내 웹 양식 사이트에서는 등록 된 첫 번째 ADFS 공급자 만 성공합니다. 두 번째 것은 항상 이 인증 후 내 사이트로 돌아온 후 SignatureVerificationFailedException을 throw합니다. 예외는 내 측면에서 발생합니다. OWIN 시작 구성에서 app.Map (...) 또는 app.Use (...)를 사용하든 관계 없습니다.
내 웹 사이트를 웹 응용 프로그램으로 변환하려고했지만 동일한 결과가 나타납니다. MVC와는 다른 WEB FORMS에서 요청이 처리되는 방식과 관련이 있다고 생각합니다.

미들웨어 매핑을 다른 방식으로 처리해야합니까?
내가 무엇이 누락 되었습니까?
또는이 전혀 불가능합니다 ... 여기 ASP.NET 웹 양식 사이트 - OWIN KATANA를 사용하여 여러 ADFS와 통합

내 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, CallbackPathWreply에서 계산 설정되어 있지 않은 경우,

2) 각 공급자에 대해 Wreply을 구별 한 후에 다른 문제가 나타나기에 충분하지 않음이 밝혀졌습니다. 그런 다음 (MVC 작업 샘플을 사용하여) WtrealmWreply이 동일한 값을 가져야 함을 발견했습니다.

3) ASP.NET Web Forms에서 서로 다른 공급자에 대해 서로 다른 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(...)에서 OwinStartup. app.UseWsFederationAuthentication(...)을 통해 각 미들웨어를 추가하는 것이 좋습니다.