6

Мы создаем платформу, на которой клиент является ASP .Net MVC one, используя ASP Net Identity 2.0 для аутентификации и авторизации (с использованием претензий), который отлично работает на веб-сторона.ASP. Net MVC и интеграция с идентификатором WCF

У нас также есть служба WCF, которая позволяет выполнять операции CRUD в базе данных (для нескольких клиентских приложений), которая получает запросы от этого клиента ASP .Net MVC. Как мы хотим проверить (аутентифицировать & авторизацию) пользователя перед выполнением определенных действий CRUD в стороне WCF, нам нужно получить претензии пользователя от клиента и выполнить проверки (желательно очень чисто, используя заголовки или любое обязательство, которое WCF сможет поддержать в этом вопросе).

Я искал разные форумы, но без простого ответа на этот учебник. Может ли кто-нибудь помочь в этом вопросе?

Thanks, Nir.

+0

Нир, ваша проблема, кажется, передает претензии к вашей службе WCF. Вы можете передать фактические претензии, которые вы получаете из Identity, или можете передать массив или DTO значения, которые представляют авторизации, и идентификатор, который вы хотите передать на ваш сервис ... –

+0

@nirpi, что вы хотите, чтобы ваш сервис потреблял : учетные данные или токен безопасности? –

+0

@DaveAlperovich, я хотел бы получить претензии из заголовка, если это возможно, поэтому мне не нужно было «грязно» использовать все мои общедоступные методы с дополнительными параметрами для аутентификации. – nirpi

ответ

1

Я люблю это:

в вашей реализации IEndpointBehavior сделать это на стороне клиента:

public object BeforeSendRequest(ref Message request, IClientChannel channel) 
    { 
     request.Headers.Add(MessageHeader.CreateHeader("token", "http://myurl.com/service/token", _theToken)); 
     return null; 
    } 

затем на конце службы добавить к вашему ServiceAuthenticationManager

public override ReadOnlyCollection<IAuthorizationPolicy> Authenticate(
     ReadOnlyCollection<IAuthorizationPolicy> authPolicy, Uri listenUri, ref Message message) 
    { 
     IPrincipal user = new MyUserPrincipal(null); 

     if(_currentServiceContractType.GetInterfaces() 
             .Any(x => x == typeof(IMySecuredService))) 
     { 
      var tokenPosition = message.Headers.FindHeader("token", "http://myurl.com/service/token"); 

      if (tokenPosition >= 0 && tokenPosition <= 5) 
      { 
       var encryptedToken = message.Headers.GetHeader<string>(tokenPosition); 

       if (!string.IsNullOrWhiteSpace(encryptedToken)) 
       { 
        var serializedToken = new MyEncryptionUtility().Decrypt(encryptedToken); 
        var token = MyTokenSerializer.Deserialize(serializedToken); 
        var expire = new DateTime(token.ValidToTicks); 
        if (expire > DateTime.Now) 
        { 
         user = new MyUserPrincipal(token); 
        } 
       } 
      } 
     } 
     message.Properties["Principal"] = user; 
     Thread.CurrentPrincipal = user; 
     return authPolicy; 
    } 

Это дает вам затем возможность использования построенных претензий или аутентификации претензий WIF. В остальном это очень просто. Маркер создается службой и отправляется клиенту (сети) и сохраняется в файле cookie. то, когда есть какие-либо запросы, токен извлекается из файла cookie, а затем отправляется в службу, где неизбежно вы можете начать добавлять службу разрешений, а не делать их на стороне web/mvc, делая гораздо более чистую базу кода, используя каждый любимый друг, SOA> = :)