1

Может ли кто-нибудь сказать мне, что происходит с этим подходом для одиночного пения?Как настроить аутентификацию запроса на отдельном веб-сайте аутентификации asp.net mvc с помощью Thinktecture 2 с дружественной страницей входа пользователя?

У меня есть сайт A с логикой аутентификации внутри. Пользователь может выбрать роль для доступа к порталу, который он хочет отправить. Проблема в том, как правильно настроить эти веб-сайты для правильной перенаправления, потому что когда я перенаправляю, я теряю токен (перенаправление - это GET), у меня никогда не было файла cookie на портале, который я хочу отправить. У меня что-то отсутствует в моей реализации? Может быть, конфигурация на портале, которую я хочу перенаправить? Я не использую аудиторию Uri в webconfig, это связано с проблемой? Я использую службу, которая дает мне токен, если пользователь аутентифицирован. Затем с этим маркером я хочу перенаправить страницу на соответствующий портал.

enter image description here

enter image description here

Сказал, что я покажу вам метода регистрации в AccountController

[HttpPost] 
    public async Task<ActionResult> Login(string ddlRoles, string ddlUrls, LoginModel user) 
    { 
     var service = new AuthenticationServiceAgent(user.Username, user.Password); 
     var securityService = new SecurityServiceAgent(service.GetToken()); 

     ...processing the claims 
     //AT THIS POINT THE USER IS AUTHENTICATED 
     FederatedAuthentication.WSFederationAuthenticationModule.SetPrincipalAndWriteSessionToken(token, true); 
     .... get the url to redirect 
     Response.Redirect(urlToRedirect, false); 
    } 

Мой класс Proxy выглядит так

public class UserNameTokenServiceProxy : TokenServiceProxy 
    { 
     #region Properties 

     public SecurityCredential Credential { get; set; } 

     #endregion 

     #region Methods 

     public override SecurityToken GetToken(ISecurityCredential credential = null) 
     { 
      if (null == credential) 
      { 
       throw new ArgumentNullException("credential"); 
      } 

      var factory = new WSTrustChannelFactory(
       new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential), 
       new EndpointAddress(StsEndPoint) 
      ); 

      factory.TrustVersion = TrustVersion.WSTrust13; 

      if (null != factory.Credentials) 
      { 
       factory.Credentials.UserName.UserName = credential.UserName; 
       factory.Credentials.UserName.Password = credential.Password; 
      } 

      var rst = new RequestSecurityToken() 
      { 
       RequestType = RequestTypes.Issue, 
       KeyType = KeyTypes.Symmetric, 
       TokenType = TokenTypes.Saml11TokenProfile11, 
       ***********RelyingPartyUri comes from a config file********* 
       AppliesTo = new EndpointReference(RelyingPartyUri) 
      }; 

      try 
      { 
       var channel = factory.CreateChannel(); 
       var sToken = channel.Issue(rst); 

       return sToken; 
      } 
      catch (Exception ex) 
      { 
       return null; 
      } 
     } 

     #endregion 

    } 

} 

И базовый класс что один из них:

public abstract class TokenServiceProxy 
{ 
    #region Fields 

    protected string StsEndPoint; 
    protected string RelyingPartyUri; 

    #endregion 

    #region Constructors 

    protected TokenServiceProxy() 
    { 
     StsEndPoint = ConfigurationManager.AppSettings["stsEndpoint"]; 
     if (null == StsEndPoint) 
     { 
      throw new Exception("STSEndPoint cannot be null"); 
     } 

     RelyingPartyUri = ConfigurationManager.AppSettings["relyingPartyUri"]; 
     if (null == RelyingPartyUri) 
     { 
      throw new Exception("RelyingPartyUri cannot be null"); 
     } 
     //StsEndPoint = <add key="stsEndpoint" value="https://sso.dev.MyCompany.com/idsrv/issue/wstrust/mixed/username"/>; 
     //RelyingPartyUri = @"value="https://dev.MyCompany.com/MyCompanyPortal"/>"; 
    } 

    #endregion 

    #region Abstract Methods 

    public abstract SecurityToken GetToken(ISecurityCredential credential = null); 

    #endregion 

} 

В основном мы не используем конфигурацию по умолчанию для WS с audienceUri и секции federationConfiguration, эквивалент будет:

<system.identityModel.services> 
    <federationConfiguration> 
     <cookieHandler mode="Default" requireSsl="false" /> 
     <wsFederation passiveRedirectEnabled="true" issuer="https://sso.dev.MyCompany.com/idsrv/issue/wstrust/mixed/username" realm="https://dev.MyCompany.com/MyCompanyPortal" requireHttps="false" /> 
    </federationConfiguration> 
    </system.identityModel.services> 
+0

Можете ли вы также показать свои настройки web.config, в частности раздел 'microsoft.identityModel'? –

+0

@GarrettVlieger В конце примера добавлено больше деталей – Zinov

+0

@GarrettVlieger в основном мы используем прокси для получения токена, AuthenticationServiceAgent внутренне передает через contructor ISecurityCredential экземпляр UserNameTokenServiceProxy, и все, кто использует эту службу, получают токен – Zinov

ответ

0

Я не совсем уверен, что все компоненты в вашем но в любом случае вы, похоже, пытаетесь сделать слишком много по своему усмотрению. SSO или нет - каждому интегрированному приложению необходимо поддерживать собственное состояние аутентификации (с помощью cookie аутентификации), и для этого ему необходимо получить токен безопасности от Identity Provider. В наиболее распространенном сценарии для WS-Federation (инициированный партией SSO) приложение Relying Party перенаправляет пользователя в Identity Provider, поставщик удостоверений проверяет учетные данные пользователя и токен безопасности POSTS на приложение Relying Party, где он обрабатывается модулем WS-Federation для создания cookie аутентификации. В вашем случае я предполагаю, что вы пытаетесь достичь «Идентификатор провайдера, инициированного» SSO (предполагая, что ваша страница входа является частью Identity Provider). Если это так, вам нужен POST-маркер безопасности для выбранной Relying Party (насколько я знаю, WS-Federation не поддерживает отправку токенов в строку запроса GET). Конечно, вам нужно иметь правильную конфигурацию WS-Federation на стороне вашей стороны, чтобы принять этот токен и создать файл cookie для проверки подлинности - если аутентификация выполняется автоматически с помощью модуля WS-Federation.

+0

В моем сценарии у меня есть служба, которая запрашивает токен для себя, каждое приложение включало, что мои сайты могут запрашивать токен через эту услугу (ретранслятор в этом случае будет таким же для всех, потому что услуга является единственной которые обращаются к поставщику удостоверений, поэтому полагающаяся сторона является сервисом). Каждое веб-приложение передает правильные учетные данные веб-сервису, который выполняет проверку подлинности и отвечает на токен. Таким образом, конфигурация, указывающая непосредственно на STS, включена webservice, нет под моими веб-сайтами. – Zinov

+0

Мне нужно, чтобы файл cookie FedAuth присутствовал на веб-сайте B после моего перенаправления с сайта A на веб-сайт B. Помните, что я не перехожу на страницу аутентификации поставщика удостоверений, вместо этого я вызываю свое обслуживание. – Zinov

+0

Итак, если вы правильно поняли, вы вообще не используете режим SSO «pasive redirection». В таком случае вам нужно передать «что-то» из приложения A в ap что B позволяет аутентифицировать пользователя без запроса его/ее полномочий. – Jarek

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