2010-09-13 2 views
0

У меня есть usercontrol, который отвечает за представление создания и смены пользователей. UserControl привязан к лицу, сделанной в РИА службой:Лучший подход: диалог установки/изменения пароля

[MetadataType(typeof(User.UserMetadata))] 
public partial class User 
{ 
    internal class UserMetadata 
    { 
     protected UserMetadata() {} 

     [Required] 
     public string Name { get; set; } 

     [Exclude] 
     public string PasswordHash { get; set; } 

     [Exclude] 
     public int PasswordSalt { get; set; } 

     [Required] 
     public string ShortName { get; set; } 

     [Include] 
     public IEnumerable<UserRole> UserRoles { get; set; } 
    } 

    [DataMember] 
    [RegularExpression("^.*[^a-zA-Z0-9].*$", ErrorMessageResourceName = "BadPasswordStrength", ErrorMessageResourceType = typeof(ErrorResources))] 
    [StringLength(25, MinimumLength = 6)] 
    public string NewPassword { get; set; } 
} 

При создании нового пользователя, в поле «NewPassword» требуется - но при изменении свойств существующего пользователя, он не является (оно используется для изменения пароля).

Каков наилучший подход для решения этой проблемы? У меня есть несколько идей, но все они чувствуют себя немного дерьмовый :-)

Благодарности

ответ

1

Похоже, вы передаете свои текущие пароли обратно в GUI. Нет необходимости когда-либо делать это. Это создало бы потенциальное отверстие для безопасности.

Предложите, чтобы вы рассматривали изменение пароля как отдельный вызов службы, а не просто простое редактирование записей. Услуги RIA поддерживают Invoke Operations, которые в основном являются произвольными прямыми вызовами вашего сервиса RIA. Единственным ограничением на операции Invoke является то, что они не могут возвращать сложные типы (не проблема для этого примера).

Pass ваш вошедшего в идентификатор пользователя, текущий пароль (закодированный) и новый пароль (закодированный) и сделать все стороны работы сервера . Возвратите простое логическое значение.

Только некоторые предложения, я рад видеть идеи других людей по этому поводу :)

+1

Я запомню это. Вы никогда не должны включать пароли в свои сущности. Вместо этого сделайте их параметры метода и убедитесь, что они не включены в uri (используйте POST). Кроме того, переключитесь на использование https на основании. Я опубликовал некоторые рекомендации о том, как это сделать с членством в ASP.NET и как использовать https в моем блоге. http://blogs.msdn.com/b/kylemc/archive/2010/05/10/using-asp-net-membership-in-silverlight.aspx http://blogs.msdn.com/b /kylemc/archive/2010/05/26/ria-services-using-https.aspx –

+0

Нет. Я никогда не выталкиваю пароль в графический интерфейс, свойство NewPassword «вычисляется» и не сопоставляется с атрибутом table. Это просто, чтобы сменить пароль и начальные пароли от пользователя. Просто, чтобы убедиться. Ваше предложение состоит в том, чтобы удалить это свойство и ввести услугу, которая несет ответственность только за установку/сброс пароля? Звучит нормально - даже я не понимаю разницы. – Daniel

+0

@ Даниэль: Если вы только отправляете пароль уже зашифрованным, ваша идея также работает. Вы действительно шифруете свой пароль на клиенте? Это была моя главная проблема. –

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