2015-12-02 7 views
1

Моих ASP.Net приложение использует Owin/Катану/Требования и позволяет вход с помощью:Owin Challenge() метод не выполняется при использовании несколько ADFS + Cookies

  1. Традиционного имени пользователя/пароля (существует для всех пользователей)
  2. Google
  3. Azure AD

Он отлично работает, и все необходимые редиректы/утверждает, переводы работают хорошо (пользователь NameIdentifier/услуг (/ арендатора) детали передаются обратно в мое приложение, так уникальных значений идентификаторов могут быть связаны). Обратите внимание, что пользователи не регистрируются/регистрируются для приложения - доступ предоставляется суперпользователем их организации, а также имя пользователя/пароль, отправленные им, которые затем могут подключаться к Google/Azure.

Однако теперь мне нужно расширить эту функциональность, чтобы пользователи могли подключиться к провайдеру ADFS своей организации. Единственный рабочий пример для этого, который удаленно закрыт, находится здесь (tutorial/code), но он строго основан только на ADFS. Когда я адаптирую это в свой проект, он не работает.

Весь мой файл StartupAuth показан ниже. Я ценю, что могут быть ошибки конфигурации, но на основе отрывков образцов, которые я нашел за последние шесть недель, это лучшее, что у меня было.

public void Configuration(IAppBuilder app) 
    { 
     // STANDARD CODE FOR APP COOKIE AND GOOGLE - WORKS PERFECTLY 

     CookieAuthenticationOptions coa = new CookieAuthenticationOptions { 
      AuthenticationMode = AuthenticationMode.Active, 
      CookieName = "MyAppName", 
      ExpireTimeSpan = TimeSpan.FromMinutes(60), 
      SlidingExpiration = true, 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/login.aspx"), 
      CookieHttpOnly = true, 
      CookieSecure = CookieSecureOption.SameAsRequest, 
      Provider = new CookieAuthenticationProvider { OnValidateIdentity = context => 
      { 
       dynamic ret = Task.Run(() => 
       { 
        // Verify that "userId" and "customerId" claims exist, and that each has a valid value (greater than zero) - removed for brevity 
        return Task.FromResult(0); 
       }); 
       return ret; 
      } } 
     }; 
     app.SetDefaultSignInAsAuthenticationType(coa.AuthenticationType); 
     app.UseCookieAuthentication(coa); 

     app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 
     app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions { 
      ClientId = "84***********************k3.apps.googleusercontent.com", 
      ClientSecret = "jue*****************Ppi" 
     }); 



     // NEW CODE THAT FAILS TO WORK - SPECIFYING EACH CUSTOMER'S ADFS AS A NEW WSFED AUTH OPTION 


     WsFederation.WsFederationAuthenticationOptions Adfs_CompanyA = new WsFederation.WsFederationAuthenticationOptions { 
      AuthenticationMode = AuthenticationMode.Passive, 
      MetadataAddress = "https://CompanyA.net/FederationMetadata/2007-06/FederationMetadata.xml", 
      AuthenticationType = AdfsAuthenticationTypes.CompanyA, 
      Wtrealm = "https://www.CompanyA.co.uk/MyAppName" 
     }; 

     WsFederation.WsFederationAuthenticationOptions Adfs_CompanyB = new WsFederation.WsFederationAuthenticationOptions { 
      AuthenticationMode = AuthenticationMode.Passive, 
      MetadataAddress = "https://CompanyB.net/federationmetadata/2007-06/federationmetadata.xml", 
      AuthenticationType = AdfsAuthenticationTypes.CompanyB, 
      Wtrealm = "http://www.CompanyB.co.uk/azure/MyAppName" 
     }; 

     // User (who is logged in), route for hyperlink "Link my account with ADFS" 
     app.Map("/SSO/LinkUserAccount/ADFS/process", configuration => { configuration.UseWsFederationAuthentication(Adfs_CompanyA); }); 

     // CompanyA ADFS - single sign-on route 
     app.Map("/SSO/Login/CompanyA/ADFS/Go", configuration => { configuration.UseWsFederationAuthentication(Adfs_CompanyA); }); 

     // CompanyB ADFS - single sign-on route 
     app.Map("/SSO/Login/CompanyB/ADFS/Go", configuration => { configuration.UseWsFederationAuthentication(Adfs_CompanyB); }); 
    } 
} 

Вот код, я использую, чтобы выпустить Owin вызов:

string provider = MyApp.SingleSignOn.GetCustomerAdfsAuthenticationType(customerName); 
string redirectUrl = string.Format("{0}/SSO/Login/{1}/ADFS/Go", Request.Url.GetLeftPart(UriPartial.Authority), provider); // creates https://myapp.com/SSO/Login/CompanyA/ADFS/Go for CompanyA users 
Context.GetOwinContext().Authentication.Challenge(new AuthenticationProperties { RedirectUri = redirectUrl }, provider); 
Response.StatusCode = 401; 
Response.End(); 

Это WebForms, но, пожалуйста, не позволяйте, что остановить MVC про от содействия. В любом случае, код практически идентичен, и я использую маршруты.

Проблема заключается в том, что когда пользователь нажимает ссылку «Вход в систему с ADFS», например. URL становится https://myapp.com/SSO/Login/CompanyA/ADFS Я получаю ошибку 401 Unauthorized, вместо того, чтобы пользователь перенаправлялся на страницу входа в ADFS.
В web.config я разрешаю несанкционированный доступ к пути «SSO». По какой-то причине метод Challenge() никогда не перенаправляет пользователя, он просто игнорируется и код достигает точки, где он возвращает 401. Значение строки provider точно соответствует значению WsFederationAuthenticationOptions.AuthenticationType, определенному в Startup.Auth.

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

ответ

4

Я решил проблему. Удивительно, но это было так просто, как мне не хватает этого с конца StartupAuth:

app.UseStageMarker(PipelineStage.Authenticate); 
0

Вы настроили регистрацию OWIN? Есть какие-то подсказки?

Также Test driving the WS-Federation Authentication Middleware for Katana.

Посмотрите на код в IdentityServer 3. Там есть плагин WS-Fed, а документация - here (внизу).

+0

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

+0

IdentityServer 3 поддерживает социальные (Google и т. Д.) OpenID Connect, OAuth2 и WS-Fed – nzpcmad

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

  • Нет связанных вопросов^_^