У меня есть веб-приложение 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
}
Это способ сделать это? Или я должен придерживаться другого подхода.
Как вы справляетесь с этим объединенным именем пользователя, когда вам нужно использовать его в веб-приложении: разбор строки перед @ каждый раз или? Я думал об этом, но в будущем это было похоже на сложность. – dlght
@dlght: На данный момент мы просто идем вперед и показываем это. Мы ожидаем, что подавляющее большинство времени будет соответствовать адресу электронной почты пользователей, который они обычно видят. Но в какой-то момент, если это смущает пользователей, мы можем отделить понятие «фактического» имени пользователя от «отображаемого» имени пользователя. Пока вы пишете DRY, SOLID код, это не составит труда. Но это единственный способ, и если вы чувствуете, что другой способ работает лучше, пойдите для этого. – StriplingWarrior