2016-09-21 4 views
0

У меня есть приложение, которое в настоящее время работает только с аутентификацией Forms, но теперь оно будет отображаться в Интернете с использованием HTTPS/SSL, и в этом случае ему необходимо принять аутентификацию STS/ADFS.Как разрешить аутентификацию ADFS/STS и Forms в одном приложении?

Я выполнил инструкции из этой статьи MSDN: https://msdn.microsoft.com/en-us/library/hh291061.aspx, но как я могу настроить приложение для использования обоих методов проверки подлинности? Настройки

Web.config применяется:

<configSections> 
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 --> 

    <section name="glimpse" type="Glimpse.Core.Configuration.Section, Glimpse.Core" /> 
    <section name="system.identityModel" type="System.IdentityModel.Configuration.SystemIdentityModelSection, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 
    <section name="system.identityModel.services" type="System.IdentityModel.Services.Configuration.SystemIdentityModelServicesSection, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" /> 
</configSections> 


<location path="FederationMetadata"> 
    <system.web> 
     <authorization> 
      <allow users="*" /> 
     </authorization> 
    </system.web> 
</location> 
<authentication mode="None" /> 

<authorization> 
    <deny users="?" /> 
</authorization> 

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <handlers> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
     <add name="ReportViewerWebControlHandler" preCondition="integratedMode" verb="*" path="Reserved.ReportViewerWebControl.axd" type="Microsoft.Reporting.WebForms.HttpHandler, Microsoft.ReportViewer.WebForms, Version=11.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91" /> 

     <add name="Glimpse" path="glimpse.axd" verb="GET" type="Glimpse.AspNet.HttpHandler, Glimpse.AspNet" preCondition="integratedMode" /> 
    </handlers> 

    <modules> 
     <add name="Glimpse" type="Glimpse.AspNet.HttpModule, Glimpse.AspNet" preCondition="integratedMode" /> 
     <add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" /> 
     <add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" /> 
    </modules> 
</system.webServer> 

<system.identityModel> 
    <identityConfiguration> 
     <audienceUris> 
      <add value="https://localhost:44300/Desvio/" /> 
     </audienceUris> 
     <issuerNameRegistry type="System.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> 
      <trustedIssuers> 
       <add thumbprint="‎a527140bc9f440ebd6992ba26c6ea4758c3a2738" name="sts-dev.myserver.com" /> 
      </trustedIssuers> 
     </issuerNameRegistry> 
     <certificateValidation certificateValidationMode="None" /> 
    </identityConfiguration> 
</system.identityModel> 
<system.identityModel.services> 
    <federationConfiguration> 
     <cookieHandler requireSsl="false" /> 
     <wsFederation passiveRedirectEnabled="true" issuer="https://sts-dev.myserver.com/adfs/ls/" 
        realm="https://localhost:44300/Desvio/" reply="https://localhost:44300/Desvio/" requireHttps="true" /> 
    </federationConfiguration> 
</system.identityModel.services> 

ответ

0

Вы не можете.

С ADFS вы можете иметь тот или иной вариант в зависимости от конфигурации ADFS.

Существует исключение - если у вас есть ADFS WAP, internal = WIA, External = FBA.

Если внутренний браузер не установлен для IWA, вы получаете всплывающее окно входа в систему.

+0

Я полагаю, что вы хотели сказать, что нет «родной» поддержки, потому что я нашел несколько статей, показывающих способы выполнения этого auth. Я просто не знаю, работает ли это, но завтра я попробую. :). https://leastprivilege.com/2012/02/02/mixing-forms-and-token-authentication-in-a-single-asp-net-application/, http://blog.elis-co.com/wif -sso-and-forms-authentication-in-asp-net/ –

+0

Прохладный - путаница двух концепций - ADFS FBA и ASP.NET Forms Authentication. Я видел эту статью в прошлом, но не мог заставить ее работать :-(IIRC, WIF по умолчанию защищает все приложение. – nzpcmad

+0

Опция с использованием настраиваемого атрибута не работает (точки останова никогда не попадают), теперь я дам попробуйте иметь отдельное приложение для SSO, которое разделяет файл cookie auth с основным приложением. –

1

Если я правильно понимаю, это должно быть довольно легко. Модуль Forms Auth предназначен только для публикации файла cookie для локального приложения и ведения сеанса для текущего пользователя. Не имеет значения, как вы получаете аутентификацию, проверяя имя пользователя/пароль в своем приложении или принимая токен SAML.

Технически удалите модули SAM и FAM из трубопровода. Сделайте Forms свой метод аутентификации снова, чтобы у вас было обычное приложение на основе auth.

Затем просто добавьте код в конечную точку входа, который дополнительно принимает входящий токен SAML из ADFS или любой другой STS. Вы можете последовать мой учебник

http://www.wiktorzychla.com/2014/11/simplest-saml11-federated-authentication.html

Важная частью коды является удивительно простым

 var securityToken = fam.GetSecurityToken(request); 

     var config = new SecurityTokenHandlerConfiguration 
     { 
      CertificateValidator = X509CertificateValidator.None, 
      IssuerNameRegistry = new CustomIssuerNameRegistry() 
     }; 
     config.AudienceRestriction.AudienceMode = AudienceUriMode.Never; 

     var tokenHandler = new SamlSecurityTokenHandler 
     { 
      CertificateValidator = X509CertificateValidator.None, 
      Configuration  = config 
     }; 

     // validate the token and get the ClaimsIdentity out of it 
     var identity = tokenHandler.ValidateToken(securityToken); 

Как только у вас есть идентификатор пользователя от входящих маркеров, используйте Форму Auth для выдачи тот же самый файл cookie, который вы выведете в обычном приложении на основе auth (обратите внимание, что в моем учебнике я пишу здесь cookie SAM, что является еще одной возможностью, с которой вы не хотите следовать, поскольку вы настаиваете конкретно на куках файлов).

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