2014-04-04 4 views
2

MVC5에서 역할 관리를 처리하는 ID 방법과 관련하여 많은 블로그 게시물을 읽었지만 대부분은 등록 시스템 등을 통합하는 것 같습니다. 나는 단순히 역할을 사용할 수 있는지 알고 싶습니다.ASP.NET MVC5 Identity 롤을 기존 인트라넷 프로젝트에 추가하기

Active Directory에서 내 사용자를 끌어와 사용자 지정 사용자 모델 클래스에 저장하는 기존 MVC5 프로젝트가 있습니다. ID 역할 관리를 그러한 프로젝트와 통합 할 수 있습니까?

저는 ASP.Net MVC가 새로 도입되어 지금까지 몇 가지 두통을 낳았습니다. IdentityUser를 확장하는 모델 클래스를 사용해야합니까? 그렇다면 여전히 활성 디렉토리 사용자를 사용하고 GUID, 전자 메일, 이름 등을 해당 새 클래스에 매핑 한 다음 역할을 사용하여 내 응용 프로그램보기에 대한 액세스를 제한 할 수 있습니까?

답변

1

프로덕션 환경에서 ASP.NET ID를 아직 사용하지는 않지만 (몇 달 안에) 테스트 프로젝트를 만들어 내부 사용자의 활성 디렉토리에 대해 인증합니다. 이 작업을 수행하려면 고유 한 구현을 롤업해야합니다. 여기

내가 다른 방법에 Active Directory를 타격하고 방법을 보여 일부 단축 샘플은 다음과 같습니다

역할

public async Task<IList<string>> GetRolesAsync(User user) { 
    List<string> roles = new List<string>(); 

    //Active Directory Roles 
    if (user.Email.Contains("@mycompany")) { 
     var directory = new CompanyDirectory(); 

     var adGroups = directory.GetGroupsByUser(user.Email); 

     if (adGroups != null && adGroups.Count > 0) { 
      roles.AddRange(adGroups); 
     } 
    } 

    //SQL Server Roles 
    var dbRoles = await _context.Users 
     .Where(u => u.UserName == user.UserName) 
     .SelectMany(u => u.Roles) 
     .Select(r => r.Name) 
     .ToListAsync(); 

    roles.AddRange(dbRoles); 

    return roles; 
} 

인증

public override async Task<User> FindAsync(string userName, string password) { 
    var identityUser = await base.FindByNameAsync(userName); 

    if (identityUser != null) { 
     if (userName.EndsWith("@mycompany.net")) { 
      var directory = new CompanyDirectory(); 
      var isValidated = directory.ValidateUser(userName, password); 

      if (isValidated) { 
       return identityUser; 
      } 
     } else { 
      //SQL Server Auth 
     } 
    } 

    return null; 
} 

당신은 필요가 없습니다 실제로는 기본 클래스 인 IdentityUser 클래스를 확장해야합니다. SQL Server를 사용하는 경우에도 내 데이터베이스 스키마는 기본 ASP.NET ID 구현과 많이 다르므로 내 자신의 모델을 사용합니다. 적어도 구현해야하는 것은 IUser입니다 (실제로 이것은 IdentityUser이 구현 한 것입니다). 여기에 그것을 구현하는 방법은 다음과 같습니다.

public partial class User : IUser<Guid> { 

} 

Entity Framework에서 사용하는 모든 속성과 정보가 들어있는 같은 이름의 부분 클래스가 있습니다.

+0

답변 해 주셔서 감사합니다. 나는 완전히 이해할 지 모르겠다. 내 사용자는 이미 내 DB에 저장되어 있지만 원래 Active Directory에서 가져 왔지만 내 사용자 모델로 복사됩니다. 내 자신의 역할을 만들고 싶습니다 (그들은 AD에서 정의되지 않았습니다). 나는 Admin, Developper, NormalUser와 같은 것들을 가지고 Role 모델을 만든다. 이런 상황에서 위에 붙여 넣은 코드가 효과가 있습니까? 도움에 다시 한번 감사드립니다. –

+1

물론, 내가 만들고있는 요점은 기본 데이터 저장소가 원하는대로 될 수 있다는 것입니다. 올바른 데이터를 처리하기 위해 인터페이스를 구현하면됩니다. –