0

У меня есть веб-приложение MVC 4, и в настоящее время я использую простое членство с тремя пользователями и двумя ролями. Мои пользователи таблица выглядит следующим образом:Настроить простой поставщик членства, чтобы разрешить создание пользователей с одинаковыми именами пользователей для разных компаний в приложении C# .net MVC 4

[Table("UserProfile")] 
public partial class UserProfile 
{ 
    [Key] 
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
    public int UserId { get; set; } 
    public string UserName { get; set; } 
    public int CompanyId { get; set; } 
} 

Мне нужно реализовать членство, которое может создавать пользователь с одинаковым именем для разных компаний, но метод websecurity.CreateUserAndAccount does't позволяет дублирующие имена пользователей. На данный момент я реализовал свой собственный метод ValidateUsers, который выглядит так:

public class ExtendedSimpleMembershipProvider 
{ 
    private static IMyProjectRepository myProjectRepository = new MyProjectRepository(new MyProjectEntities()); 

    public static bool ValidateUser(string username, string password, string companyName) 
    { 
     int companyId = myProjectRepository.GetCompanyIdByName(companyName); 

     int? userId = companyId == 0 ? null : GetUserId(username, companyId); 

     if (userId.HasValue && userId.Value != 0) 
      return WebSecurity.Login(username, password); 
     else 
      return false; 
    }  

    private static int? GetUserId(string username, int companyId) 
    { 
     var userId = (from users 
         in myProjectRepository.GetUserProfiles() 
         where (users.UserName.ToLower() == username.ToLower()) && (users.CompanyId == companyId) 
         select users.UserId).FirstOrDefault(); 
     return userId; 
    } 
} 

Это подтверждает, что пользователи работают нормально. Могу ли я продлить WebSecurity.CreateUsersAndAccount, чтобы создавать пользователей с одинаковыми именами пользователей для разных компаний, не реализуя мое собственное членство или только с расширением простого членства, это было бы невозможно. Я думал о чем-то вроде: Создайте пользователя только в userProfile в базе данных, а затем добавьте пользователя в таблицу членства с уже созданным userId из таблицы userProfile. Это должно работать, потому что в таблице UserProfile уникальным является только UserId и ключ.

public override static string CreateUserAndAccount(string userName, string password, object propertyValues = null, bool requireConfirmationToken = false) 
{ 
    if(string != null && password && null && propertyValues.CompanyId != null) 
    { 
      UserProfile user = new UserProfile(); 
      user.Name = userName; 
      user.CompanyId = propertyValues.CompanyId; 
      context.UserProfile.Add(user); 
      context.SaveChanges(); 
    } 

    // here create new record in the membership table 
} 

Это способ сделать это? Или я должен придерживаться другого подхода.

ответ

1

То, как мы это сделали в моем проекте, заключается в добавлении постфикса домена к имени пользователя на основе клиента. Таким образом, вы можете получить базу данных «[email protected]» или «[email protected]». Таким образом, мы можем в значительной степени использовать стандартного поставщика членства и просто добавить постфикс, прежде чем пытаться аутентифицировать пользователя.

+0

Как вы справляетесь с этим объединенным именем пользователя, когда вам нужно использовать его в веб-приложении: разбор строки перед @ каждый раз или? Я думал об этом, но в будущем это было похоже на сложность. – dlght

+0

@dlght: На данный момент мы просто идем вперед и показываем это. Мы ожидаем, что подавляющее большинство времени будет соответствовать адресу электронной почты пользователей, который они обычно видят. Но в какой-то момент, если это смущает пользователей, мы можем отделить понятие «фактического» имени пользователя от «отображаемого» имени пользователя. Пока вы пишете DRY, SOLID код, это не составит труда. Но это единственный способ, и если вы чувствуете, что другой способ работает лучше, пойдите для этого. – StriplingWarrior

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

  • Нет связанных вопросов^_^