2011-10-13 4 views
2

그래서 권한 부여 루틴을 구현하는 것이 나쁜지 읽어 보았습니다!AuthorizeAttribute MVC - 사용자가 만든 콘텐츠에 대한 액세스를 제한합니다.

http://www.nashcoding.com/2011/02/05/using-the-forms-authentication-membership-provider-on-appharbor/

내가

public ActionResult DisplayAccount(int someid){ 
    Account a = context.Accounts.Single(a => a.id == someid); 

    // currentUserId() returns userid from FormsAuthentication 
    if (!a.owner == currentUserId()){ 
     /* Not Authorised! */ 
    } 
} 

(인증 된 사용자가 로그인 한 사용자가 아닌 경우 계정 정보에 대한 액세스를 방지, 예를 들어)과 같은 내 행동을 구현했습니다 때문에 나는 겁있어 어떤 ASP가 내 작업을 캐시하기로 결정한 경우 (즉, 작업이 실행되지 않을 수도 있음) 분명히 의미합니다.

은 그래서 지금은 인증 된 사용자가 검색된 리소스에 대한 액세스가있는 경우
  • 검사를 인증하지 않으면

    • 액션에 대한 액세스를 방지되는,해야 할 일을 할 AuthorizeAttribute을 사용으로 찾고 있어요

    그러나 나는 그것에 대해 생각할 때마다 두 번째 지점을 구현하는 방법을 생각할 수 없습니다. 역할은 사이트 차원에서 작동하기 때문에 작동하지 않지만 응용 프로그램 내에서 사용자는 역할 (예 : 소유자, 중재자, 참여자, 사용자 등)을 가지며 응용 프로그램의 각 부분 내에서만 이러한 역할을 갖습니다. 스레드 소유자, 위키에 대한 기고자, 포럼 중재자 등)

    나는 AuthorizeCore를 무시하는 몇 가지 예제를 실행했습니다. 내가 가진 각 리소스에 대해 여러 개의 AuthorizeAttribute 하위 클래스를 생성한다고 상상해보십시오. (다행스럽게도 많지는 않습니다.)하지만 단지 그것을 보면, 로그 인한 사용자가 있어야한다는 것을 보장하기 위해 해당 작업을 수행 할 때마다 데이터베이스를 쿼리해야합니다. 그 데이터에 액세스 할 수 있고 내 쿼리에서 수행하는 대신 모델을 얻기 위해 내 작업에서 데이터베이스를 쿼리 할 수 ​​있습니까?

    그래서 제 질문은

    • 내가 너무 많은 캐싱에 대해 너무 걱정 무엇입니까입니까? 다음 중 하나가 발생합니다.
      • 웹 사이트 사용자 A의 세부 정보가 사용자 B의 화면에 표시됩니까?
      • 웹 사이트 캐시 관리 버전 페이지 편집 권한이 있으며 일반 사용자는 캐시 된 버전을 볼 수 있습니까?
    • AuthorizeAttribute를 사용하면 문제는 발생하지 않지만 2 단계에서 수행해야 할 작업을 수행하기 전에 어떻게해야합니까? 또는 어떤 경우에 그것을 달성하는 가장 좋은 방법은 무엇입니까.
    • 또는 사용자가 로그인했는지 확인하기 위해 AuthorizeAttribute 만 사용하고 내 작업에서 다른 확인 논리를 수행합니까?

    어쨌든, 나는


    편집 (내가 결정적인 발견이 아무것도 찾을 수 없습니다)이 게시물은 이전의 모든 경로에 속하지 않는 희망 : 나는 돈 만약 내가 추측 ' 이 문제를 캐싱하지 못하도록하는 것이 맞습니까?


    편집 : 지금, 나는 바닐라 AuthorizeAttribute을 사용하려고 하겠어 들어, 다음 그때는 인증 된 행동에 대한 캐싱을 사용하지 않는 확인, 내 행동에 자원 레벨 액세스를 확인합니다. 이번 주에 더 많은 답변을 얻길 바랍니다.

  • 답변

    1

    최근 프로젝트에서 지원되는 각 모델 유형에 대해 열거 형을 사용하는 DataRightsAttribute를 만들어 다음 접근 방식을 사용했습니다. 먼저 경로 데이터, formcollection 또는 querystring에서 ID를 추출하여 작동합니다. 그런 다음 열거 형에서 결정한 모델 유형을 쿼리하고 현재 사용자가 액세스 할 권한이 있는지 확인하기 위해 적절한 검사를 수행합니다.

    사용법은 다음과 같이이었다 :

    [DataRights(ModelType.Customer)] 
    

    (우리는 오버라이드) AuthorizeAttribute과 함께 사용 및 캐싱에 문제가 발견되지 않았다.

    +0

    엄격한 규칙이 필요합니까 (항상 id를 매개 변수로 사용합니까)? 그리고이 수표를 읽는 동안 데이터베이스에 쿼리하면됩니다. –

    +0

    필자는 필연적으로 그 구현에서 소스 이름을 변경할 수있게 만들었습니다. 그러나 이드는 기본값이었다. 그리고 네, 여기에 데이터베이스가 문의되었습니다. 쿼리의 수를 줄이기 위해 래퍼를 통해 HttpRequest.Current.Items에 개체를 저장 했으므로 작업 메서드는 다시 쿼리하지 않고도 쉽게 액세스 할 수 있습니다. – Trax72

    +0

    나는이 질문에 대한 1 가지 이상의 대답을 기대했다. –