0

MVC 4 웹 애플리케이션이 있으며 현재 3 명의 사용자와 2 개의 역할을 가진 간단한 멤버십을 사용하고 있습니다.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에서만 사용자를 생성 한 다음 userProfile 테이블에서 이미 생성 된 userId를 가진 멤버십 테이블에 사용자를 추가한다. 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