2015-02-20 3 views
0

У нас есть служба WCF 4.5, и мы пытаемся ее закрепить.Проверка подлинности WCF + авторизация

У нас есть пользователи в нашей схеме базы данных, но то, что мы хотим сделать, это операции, как

[OperationsContract] 
void PostMessage(string message, int userId) 
    //used ID is supposed to be id of user who post message 

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

ServiceSecurityContext.Current.PrimaryIdentity.Name 

Но как я могу добавить его идентификатор базы данных в PrimaryIdentity. Другими словами, как проверить, что он пользователь с именем пользователя «Джон» может отправлять только его userId. Какая лучшая технология для его проверки?

Также возможно, что переменная STATIC (Current) отличается для каждого запроса. Мы используем стандартный экземпляр WCF, который является ... PerSession. Итак, как можно иметь статическую переменную, различную для каждого запроса.

Он чувствует себя довольно хромым, чтобы запрашивать базу данных для пользователя по его имени пользователя для каждого запроса.

ответ

1

Похоже на то, что запрашивает базу данных для пользователя по его имени пользователя для каждого запроса.

Я не согласен.

Чтобы обеспечить безопасный сервис WCF, я бы проверял учетные данные в запросе. Один из способов сделать это - создать пользовательский метод UserNamePasswordValidator и переопределить метод Validate. Вы также должны настроить свой Web.config, чтобы использовать свой собственный валидатор.

<behaviors> 
    <serviceBehaviors> 
    <behavior name="GeneralBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="false" /> 
     <serviceCredentials> 
     <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="WCFApp.UserNamePassValidator, WCFApp" /> 
     </serviceCredentials> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
+0

И это именно то, что я делаю. НО что, если ... представьте, что ... один пользователь создал учетную запись, и я проверяю его против db ... это нормально, тогда ... но ЧТО, если он действительно имеет значение и посылает мне свойство userId какое-то другое число, чем его собственный идентификатор , Я не хочу идти в DB AGAIN только для своего идентификатора пользователя по имени, которое я получаю от ServiceSecurityContext. – LightCZ

+0

Тогда у вас есть два варианта. Первый заключается в том, чтобы защитить вашего клиента, чтобы разрешить передачу идентификатора, отличного от текущего зарегистрированного идентификатора учетной записи пользователя. Во-вторых, лучше, потому что более безопасно проверять идентификатор и имя пользователя ServiceSecurityContext в методе 'PostMessage'. Еще одна вещь, если дело касается безопасности/целостности данных, выполняющих еще одну команду с базой данных, - это ** ничего ** по сравнению с тем, кто, как вы сказали, может отправить вам свойство идентификатора пользователя, отличное от его собственного идентификатора. – MacGyver

+0

ОК, это допустимый аргумент. Но он просто чувствует себя хромым, чтобы перейти к базе данных дважды для одного и того же объекта по одному ключу. Один раз для passwordValidation и второй раз для идентификатора пользователя. И по имени пользователя. – LightCZ

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