2009-07-15 8 views
2

asp.net .net mvc에서 웹 응용 프로그램의 특정 영역을 보호하는 가장 좋은 방법은 무엇입니까? 나는 우리가 각각의 행동에 [Authorization] 속성을 넣을 수 있다는 것을 안다. 그러나 이것은 당신이 그것을 장소 전체에 두어야하기 때문에 매우 지루한 것처럼 보인다. 멤버 자격 공급자를 사용하고 있고 폴더를 기반으로이 보호를 설정하여 다시 게시 모델에서 수행했던 방식을 시도하고 있습니다. 일부 폴더를 보호하기 위해 web.config <location> 섹션을 사용합니다. mvc에서이 작업을 시도했지만 작동하는 것처럼 보이지만 대부분 튜토리얼에서는 [Authorization] 방법을 사용합니다.asp.net .net mvc authorization

어느 것이 더 좋은 방법입니까?

답변

4

web.config에 넣지 말 것을 강력히 권합니다. 사실, Conery, Hanselman, Haack, and Guthrie도 마찬가지입니다 (Professional ASP.NET MVC 1.0의 p223)

경로는 변경 될 수 있습니다. 특히 MVC에서는 변경 될 수 있습니다. WebForm 모델을 사용하면 경로가 실제로 파일 시스템에 표시되므로 걱정할 필요가 없습니다. MVC에서 경로는 더 나은 용어가 부족하여 "동적"입니다.

하나의 컨트롤러에 매핑되는 여러 경로로 끝나면 web.config에서 유지 관리 문제가 발생할 수 있습니다. 더욱이 실수로 컨트롤러를 우연히 호출하는 경로를 실수로 만들거나 경로를 추가/수정 한 후에 web.config를 업데이트하는 것을 잊어 버리고 스스로를 열어 둘 수 있습니다.

그러나 실제 경로 대신 컨트롤러를 보호한다면 컨트롤러의 작동 및 경로 변경과 동기화 된 web.config 유지에 대해 걱정할 필요가 없습니다.

그냥 2 센트입니다.

2

컨트롤러 클래스 상단에 [인증]을 입력하십시오. 그것은 전체 컨트롤러 동작을 잠글 것입니다.

+0

감사합니다. 질문은 더 나은 모든 컨트롤러에 넣어 또는 하나의 파일 web.config에 그것을 설정합니다. 나는 web.config를 선택했다. – dritterweg

+0

그래, 그건 좀 힘들어. :) – griegs

3

한 가지 가능한 솔루션은 "보호 컨트롤러"를 작성하고 당신은 모든 콘트롤에 [권한 부여]를 넣을 수 있습니다

[Authorize] 
public class ProtectedBaseController : Controller { 

} 

public class AdminController : ProtectedBaseController { 
    ... 
} 

public class Admin2Controller : ProtectedBaseController { 
    ... 
} 
+1

어떻게 정확한 답이 가장 적은 표를 얻었습니까? – ckonig

0

을 보호 할 응용 프로그램의 모든 영역에 대한 기본 클래스로 사용하는 것입니다 당신은 보안이 필요합니다.

필터를 추가 할 수 있습니다. GlobalFilters.Add (new AuthorizeAttribute()); Startup.cs (또는 Global.asax)에 등록하고 [AllowAnonymus] 속성을 등록되지 않은 사용자에게 허용하는 모든 컨트롤러 또는 작업에 추가하십시오.

모든 보안 담당자에게 [Authorize]를 선택했다면 당신이나 다른 팀이 추가 한 컨트롤러가 안전한지 확인해야합니다. 나는 그것이 당신이 시스템은 모든 컨트롤러가 안전이 보장도하지 않습니다 때문에이 방법으로하는 생성 ProtectedContoller보다 더 나은 생각

[Fact] 
public void AllAuth() 
{ 
    var asm = Assembly.GetAssembly(typeof (HomeController)); 
    foreach (var type in asm.GetTypes()) 
    { 
     if (typeof(Controller).IsAssignableFrom(type)) 
     { 
      var attrs = type.GetCustomAttributes(typeof (AuthorizeAttribute)); 
      Assert.True(attrs.Any()); 
     } 
    } 
} 

:이 요구 사항 들어 나는 그런 테스트를 사용합니다. 또한이 방법은 프로젝트를 무겁게 만드는 상속을 사용하지 않습니다.