2012-10-26 2 views
2

Entity Framework를 사용하여 데이터를 보안하기위한 옵션/솔루션에는 어떤 것이 있습니까?Entity Framework를 사용한 데이터 보안

여기 양식에 대한 이야기는하지 않으며 여기서는 사용자가 인증 된 것으로 가정합니다.

설명하기 위해, 나는 웹 API 컨트롤러 중 하나를 연결했고 이것이이 방법 일지 궁금합니다. 내가 물어 보는 이유는이 모든 로직을 모든 컨트롤러에서 어떤 데이터에 표시 할 것인가보다 쉬운 방법이 있는지 궁금해하는 것입니다.

또한 breezejs 및 odata와 같은 시스템을 살펴보면 $ expanding = TrafficImages를 쿼리에 추가 할 수 있으므로 사용자가 내 구멍 데이터베이스를 가져 오지 못하게 할 수 있습니다.

요약하면, 사용자가 감각적 인 데이터를 다운로드 할 수 없도록 노출 된 데이터를 보호하는 방법은 무엇이 있습니까?

[AllowAnonymous] 
public object GetTheoryTests() 
{ 
    var identity = ((ClaimsIdentity)((ClaimsPrincipal)HttpContext.Current.User).Identity); 
    //if (HttpContext.Current.User.Identity.IsAuthenticated) 


    if (!identity.IsAuthenticated) 
    return db.TheoryTests.Include(t=>t.TrafficImages).Where(t=>t.PublicAvalible) 
      .Select(t => new { Id = t.Id, Title = t.Title, Images = t.TrafficImages }).AsEnumerable(); 

    if (User.IsInRole("WebAdmins")) 
     return db.TheoryTests.AsEnumerable(); 

    var key = identity.GetProvider(); 

    var member = db.Members.Include(m=>m.PayedTheoryTests).SingleOrDefault(m=>m.Identities.Any(
     i=>i.identityprovider == key.provider && 
     i.nameidentifier == key.id)); 
     if(member!=null) 
      return db.TheoryTests.Include(t => t.TrafficImages).Where(t => t.PublicAvalible).Select(t => new { Id = t.Id, Title = t.Title, Images = t.TrafficImages }).AsEnumerable(); 
     else 
      return db.TheoryTests.Include(t => t.TrafficImages).Where(t => t.PublicAvalible) 
       .Union(member.PayedTheoryTests).Select(t => new { Id = t.Id, Title = t.Title, Images = t.TrafficImages }).AsEnumerable(); 



} 

생각해 보면, 내가 놓친 것은 사용자 상태에 따라 내 데이터베이스의 뷰 모델이 아닌 것입니다. 제한된 데이터 표시와 고급 작업을위한 동일한 데이터베이스의 두 개의 엔티티 프레임 워크를 만들 솔루션일까요?

답변

3

한편 QueryInterceptor가 도착할 때까지 다른 단계를 수행해야합니다. 먼저,이 대답의 범위를 벗어나는 주제 인 Web API 컨트롤러 또는 메소드 보안 기술을 조사해야합니다.

두 번째로 w/r/t $를 확장하면 해당 기능을 조심하는 것이 옳습니다. 일부 컨트롤러 방법에 대해 요청 된 확장을 검사하거나 다른 방법에 대해이를 허용하지 않을 수 있습니다.

다행히도 비교적 쉽습니다. 요청 쿼리 문자열에 액세스 할 수 있습니다. 해당 확장에서 "$ 확장"의 존재를 감지하고 특정 확장을 허용하고 다른 확장을 허용하려는 경우 분석 할 수 있습니다.

Breeze는 향후이를 위해 도우미를 추가 할 예정입니다. 그때까지 문자열을 처리해야합니다.

최대 효과 필터가있는 경우이 필터를 직접 만들 수도 있습니다.

2

큰 질문!. 우리는 현재 QueryInterceptors라는 이름을 사용하여 서버에 제출 된 쿼리를 검사하고 변경하거나 거부 할 수 있습니다. "주체"는 각 QueryInterceptor 메서드 내에서 사용 가능한 컨텍스트 개체입니다. 이 기능은 "Breeze"웹 사이트 (www.breezejs.com)에 투표하십시오.