WCF SecurityToken
От: Norex Россия  
Дата: 02.06.10 15:00
Оценка:
Здравствуйте, господа
Вот пришлось реализовать аутентификацию на базе сообственной реализации SecurityToken'а

Но, вот объясните мне пожалуйста, при каких обстоятельствах и где это настраивается, SecurityToken будет зашифрован после WSSecurityTokenSerializer'а.

Это как-то зависит от настройки SecurityElement'a при байндинге?

Сейчас передаётся вот таким образом:
  var t = new HttpTransportBindingElement();

  var ts = new TransportSecurityBindingElement();
  ts.EndpointSupportingTokenParameters.SignedEncrypted.Add(new CorpSecurityTokenParameters());
  ts.IncludeTimestamp = true;
  ts.LocalClientSettings.DetectReplays = false;
  ts.LocalServiceSettings.DetectReplays = false;
  ts.SecurityHeaderLayout = SecurityHeaderLayout.Lax;
  
  /* новинка в 4.0 */          
  ts.AllowInsecureTransport = true;

  var binding = new CustomBinding(ts, t);

  var ep = new EndpointAddress("http://localhost:3558/CorpService.svc");
  var client = new ChannelFactory<IDataService>(binding, ep);
            
  // Credentials 
  var corpCredentials = new CorpClientCredentials();
  // Убираем существующие ClientCredentials
  client.Endpoint.Behaviors.Remove(typeof(ClientCredentials));
  client.Endpoint.Behaviors.Add(corpCredentials);
  
  // Можем работать :)          
  var ch = client.CreateChannel();

  /*****************/
   public class CorpSecurityTokenParameters : SecurityTokenParameters
    {
        public CorpSecurityTokenParameters()
        {
            RequireDerivedKeys = false;
        }

        protected CorpSecurityTokenParameters(CorpSecurityTokenParameters other)
            : base(other)
        {
            RequireDerivedKeys = false;
        }

        protected override SecurityTokenParameters CloneCore()
        {
            return new CorpSecurityTokenParameters(this);
        }

        protected override SecurityKeyIdentifierClause CreateKeyIdentifierClause(SecurityToken token, SecurityTokenReferenceStyle referenceStyle)
        {
            if (referenceStyle == SecurityTokenReferenceStyle.Internal)
            {
                return token.CreateKeyIdentifierClause<LocalIdKeyIdentifierClause>();
            }
            
            
            throw new NotSupportedException("External references are not supported for Corp tokens");
        }

        /* Добавление true - мне не сильно помогло */
        protected override bool HasAsymmetricKey
        {
            get { return true; }
        }

        protected override void InitializeSecurityTokenRequirement(SecurityTokenRequirement requirement)
        {
            requirement.TokenType = Constants.SecurityTokenName;
            requirement.KeyType = SecurityKeyType.AsymmetricKey;
            requirement.RequireCryptographicToken = true;
        }

        protected override bool SupportsClientAuthentication
        {
            get { return true; }
        }

        protected override bool SupportsClientWindowsIdentity
        {
            get { return false; }
        }

        protected override bool SupportsServerAuthentication
        {
            get { return false; }
        }
    }

    /* И сам токен */
    public class CorpSecurityToken : SecurityToken
    {
        private readonly string _id;
        private readonly DateTime _validFrom;
        private readonly DateTime _validTo;

        private ReadOnlyCollection<SecurityKey> _securityKeys;

        public CorpSecurityToken(int id, DateTime validFrom, DateTime validTo)
        {
            _id = id.ToString(CultureInfo.InvariantCulture);
            _validFrom = validFrom;
            _validTo = validTo;
        }

        public override string Id
        {
            get { return _id; }
        }

        public override ReadOnlyCollection<SecurityKey> SecurityKeys
        {
            get
            {
                if (_securityKeys == null)
                {
                    /* Скопировал из X509SecurityToken'а. Но этот код не вызывается. */
                    var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
                    store.Open(OpenFlags.ReadOnly);
                    var cert = store.Certificates.Find(X509FindType.FindBySubjectName, "localhost", false)[0];
                    var keys = new List<SecurityKey>(1) { new X509AsymmetricSecurityKey(cert) };

                    _securityKeys = keys.AsReadOnly();
                }

                return _securityKeys;
            }
        }

        public override DateTime ValidFrom
        {
            get { return _validFrom; }
        }

        public override DateTime ValidTo
        {
            get { return _validTo; }
        }
    }



Прошу помощи, т.к. там дстаточно сложный пазл для меня.
wcf securitytoken
Re: WCF SecurityToken
От: Аноним  
Дата: 02.06.10 20:00
Оценка: -1
Здравствуйте, Norex, Вы писали:
какой,биндинг используете?
если просто basicHttp — то там просто нет security tokenov — wsHttpBinding
Re[2]: WCF SecurityToken
От: Norex Россия  
Дата: 03.06.10 05:32
Оценка:
Здравствуйте, Аноним, Вы писали:
А>если просто basicHttp — то там просто нет security tokenov — wsHttpBinding
Метод авторизации и аутентификации на основе SecurityToken'ов описывается расширением к SOAP: WS-Security и для выдачи WS-Trust
И вы ещё больше удивитесь, но даже аутентификация UserName/Password — это тоже токен System.IdentityModel.Tokens.UserNameSecurityToken.

и вопрос байндинга тут мало уместен.
Re[3]: WCF SecurityToken
От: Аноним  
Дата: 03.06.10 07:37
Оценка: -1
Здравствуйте, Norex, Вы писали:

N>Здравствуйте, Аноним, Вы писали:

А>>если просто basicHttp — то там просто нет security tokenov — wsHttpBinding
N>Метод авторизации и аутентификации на основе SecurityToken'ов описывается расширением к SOAP: WS-Security и для выдачи WS-Trust
N>И вы ещё больше удивитесь, но даже аутентификация UserName/Password — это тоже токен System.IdentityModel.Tokens.UserNameSecurityToken.

N>и вопрос байндинга тут мало уместен.



Ну О"Рейли с вами не согласен )
Re[4]: WCF SecurityToken
От: Norex Россия  
Дата: 03.06.10 08:44
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Ну О"Рейли с вами не согласен )

Спросите, у O'Relly (cм. комментарии)
[с#]

/* Это тоже wsHttpBinding или это basicHttpBinding? */
var t = new HttpTransportBindingElement();
var ts = new TransportSecurityBindingElement();

ts.IncludeTimestamp = true;
ts.LocalClientSettings.DetectReplays = false;
ts.LocalServiceSettings.DetectReplays = false;
ts.SecurityHeaderLayout = SecurityHeaderLayout.Lax;

/* но на самом-то деле — это CustomBinding через Http & Certificate Security? */
var binding = new CustomBinding(ts, t);

[/c#]
Re[5]: WCF SecurityToken
От: Аноним  
Дата: 03.06.10 13:53
Оценка:
Здравствуйте, Norex, Вы писали:

N>Здравствуйте, Аноним, Вы писали:

А>>Ну О"Рейли с вами не согласен )

N>Спросите, у O'Relly (cм. комментарии)

N>[с#]

N> /* Это тоже wsHttpBinding или это basicHttpBinding? */

N> var t = new HttpTransportBindingElement();
N> var ts = new TransportSecurityBindingElement();

N> ts.IncludeTimestamp = true;

N> ts.LocalClientSettings.DetectReplays = false;
N> ts.LocalServiceSettings.DetectReplays = false;
N> ts.SecurityHeaderLayout = SecurityHeaderLayout.Lax;

N> /* но на самом-то деле — это CustomBinding через Http & Certificate Security? */

N> var binding = new CustomBinding(ts, t);

N>[/c#]


да уж — О"Рейли сказал что это транспортная безопасность, обеспечивается настройкой сертификатов...
Re[5]: WCF SecurityToken
От: Аноним  
Дата: 08.06.10 19:54
Оценка:
Здравствуйте, Norex, Вы писали:

Таки О"Рейли говорит что в basicHttBinding НЕТУ SecurityToken!!! см. стр. 461
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.