2016-10-26 2 views
0

Windows 인증을 사용하는 ASP.NET MVC5 CRUD 응용 프로그램이 있고 사이트가 Active Directory 그룹에 의해 보안되어 있으면이 그룹의 모든 구성원이 동일한 권한을 갖습니다. Entity Framework 6을 사용하여 데이터베이스에 액세스하고 있습니다.MVC5 모델의 CreatedByUserId 자동 채우기

나는 이 DOMAIN\username 일 때 현재 매우 기본적인 User 모델을 가지고 있습니다. 모든 모델은 CreatedByUserId 속성을 통해이 모델을 참조합니다. 아래의 다른 모델과의 관계는 생략했습니다. 사용자 모델을 만든 Active Directory 그룹을 통해 인증

  1. 사용자 :

    public class User 
    { 
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
        public int Id { get; set; } 
    
        [Index(IsUnique = true)] 
        [MaxLength(100)] 
        public string Login { get; set; } 
    
        [DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
        public DateTime CreatedDatetime { get; set; } 
    } 
    

    내가 어떻게 내 모든 컨트롤러에 코드를 반복하지 않고 내가 확실하지 오전하지만 두 가지를 달성 할 수 있도록하려면 이미 존재하지 않으면 데이터베이스에 저장됩니다.

  2. 새 항목이 생성되면 CreatedByUserIdUser의 동작을 수행하는 Id으로 채워집니다.

나는 첫 번째 부분은 그들이 할 때 이미 존재하지 않는 경우 새 User를 작성하고 Id을 retreive 것이다 글로벌 AuthorizeAttribute 필터를 통해 달성 할 수 있으리라 생각합니다, 그러나 이것은 나중에 참조 어디에 저장해야합니다.

두 번째 부분은 확실하지 않지만 현재 사용자를 기반으로 데이터베이스를 쿼리하지 않고도이 작업을 수행 할 수 있다고 생각합니다. User이 사이트에 액세스 할 때 Id을 사용하여 생성자를 통해이 값을 설정할 수 있습니까?

답변

0

사용자 지정 권한 특성은 좋은 아이디어처럼 들립니다. 사용자가 인증되었는지 확인하고 인증 된 그룹의 구성원인지 확인할 수 있습니다. 별도로 ID를 저장할 필요가 없음을 제안합니다. 그들의 정체성은 DbContext 당신이 SaveChanges()을 무시하고 액세스 할 수있는 사용자의 ID에

HttpContext.Current.Request.RequestContext.HttpContext.User.Identity.Name

를 통해 응용 프로그램 전체에서 사용할 수 있습니다.

protected override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    // Get user id (create if not exists) using 
    // filterContext.HttpContext.User.Identity.Name 

    // Set generic principal using Id 
    IPrincipal principal = new GenericPrincipal(
    new GenericIdentity("myuserid"), new string[] { "myrole" }); 

    HttpContext.Current.User = principal; 
} 

그런 다음 사용자 ID는 어디 이전 DOMAIN\Username 값이 있었다 액세스 할 수 있습니다 : 여기

는이 같은 일을 할 수있는 특성 당신이 당신의 권한 부여에 Overriding SaveChanges and setting ModifiedDate, but how do I set ModifiedBy?

을 시작할 수있는 좋은 링크입니다.

활성 디렉토리를 통해 인증 할 때 사용자가 결혼하거나 이혼 할 때 사용자 이름을 변경할 수 있다는 점을 염두에 두어야합니다. 광고에는 또한 참조로 사용할 수있는 고유 한 ID (Guid)가 있지만 일반적으로 사용자 프로필이 삭제되고 다시 만들어지면 변경 될 수도 있습니다.사용자 이름 (GUID로 반환 광고 ID)에 의해

쿼리 AD에서 사용자 이름으로

쿼리 내 사용자 테이블 : 당신이 당신의 자신의 사용자 레코드를 유지하는 경우에는 광고 ID를 유지해야하며, 당신의 논리는 아마 같은 것을 가야한다

내 사용자가 있음 -> 변경된 경우 광고 ID를 업데이트하십시오. 사용자를 반환하십시오.

내 사용자가 존재하지 않습니다 -> 존재 AD에 의해 내 사용자 테이블을 조회 아이디

내 사용자 -> 내 사용자 이름을 업데이트합니다. 사용자를 반환하십시오.

내 사용자가 존재하지 않습니다. -> 새 사용자 (사용자 이름, 광고 ID)를 만듭니다. 사용자를 반환하십시오.

+0

실제 이름과 다른 세부 정보를 활성 디렉토리에서 가져 와서 'Users' 테이블을 확장 할 계획입니다. 생성 된 ID는 모든 테이블에 DOMAIN \ User를 저장하는 대신 다른 모델에서 사용됩니다. 이 애플리케이션이 생성하는 데이터는 커지지 않기 때문에'DOMAIN \ User'를 키로 저장하는 것이 문제가되지 않습니다. 데이터베이스 호출을 계속하지 않아도이를 해결하는 최선의 방법을 듣고 싶습니다. – mheptinstall