2012-05-24 2 views
9

Visual Studio 2011 베타 버전을 사용하여 새 asp.net mvc4 프로젝트를 작성 중이며 모든 보안 문제를 해결하려고합니다. 처음에는 단일 사인온을 사용하는 내부 인트라넷 응용 프로그램이므로 사용자는 Windows ID/암호를 입력하라는 메시지를 표시하지 않습니다. 회사는 여러 응용 프로그램에 대한 역할을 저장하기위한 사용자 지정 응용 프로그램을 보유하고 있으며 저장 프로 시저 호출을 통해 사용할 수 있습니다. 그것은 사용자의 로그온 ID를 취하여 역할을 포함하는 일종의 컬렉션을 반환합니다. "MyApp.Data", "MyApp.User", "MyApp.Admin"입니다. 따라서이 항목을 사용자 지정 멤버 자격 공급자, 사용자 지정 역할 공급자 또는 기타 항목이라고합니다.ASP.NET MVC4 보안, 인증 및 권한 부여

권한 부여, 인증, 멤버십, 역할 등의 모든 기능을 제공하지만 현재로서는 나무의 나무가 보이지 않습니다. 기존 ASP.NET 보안 개체가 시험되고 테스트되었으며 매우 복잡한 요구 사항이 없으면 내장 된 장치 만 있으면 충분하므로 이미 이미있는 것을 사용할 수있어서 기쁩니다.

사용자가 이미 네트워크에 로그인 한 경우 이는 인증 된 것입니다. Authorization을 구현할 필요가 있습니다. 각 컨트롤러 나 액션을 Authorize 속성으로 꾸밀 필요가 있습니까? 사용자 정의 역할 저장 응용 프로그램에서 역할을 검색하면 [Authorize (Roles = "ABC")]의 "ABC"부분이 설정됩니까?

나는 여러 기사와 존 갤러 웨이에서 본 프로그램 포함 블로그 게시물을 읽을 수 있지만 나는 끝 부분에있어 손실 :

Customizing Authentication and Authorization The Right Way

그래서 많은 질문 ... 사람이 얼마나 좋은 높은 수준의 설명을 알고 있다면 모든 이것은 함께 응답합니다. 나는 모두 귀머거리입니다.

답변

8

의 인스턴스 여야합니다. 지금까지 나의 연구 결과를 낙서 :

  • 이 회사는 저장소 사용자 로그온 정보를 Active Directory를 사용하는이 회원에 사용되는 수 있도록 나는 사용자 지정 멤버 자격 공급자가 필요하지 않습니다. 사용자가 회사 네트워크에 로그온하면 인증됩니다. 전역 인증 필터를 추가하면 시스템에 액세스하는 모든 사용자를 인증해야합니다.MSDN의 릭 앤더슨에서 최신 정보까지 :

http://blogs.msdn.com/b/rickandy/archive/2012/03/23/securing-your-asp-net-mvc-4-app-and-the-new-allowanonymous-attribute.aspx 그래서 Global.asax에에 내가 추가 할 : 사용자가 인증

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
    filters.Add(new System.Web.Mvc.AuthorizeAttribute()); //new 
} 
  • 되면 그때 필요 승인 처리. 회사에는 업데이트 액세스 권한이없는 기존의 전역 데이터 저장소가 있으며 읽기 액세스 만 가능하므로 저장된 proc 호출을 통해 지정된 사용자의 역할을 검색 할 수 있습니다. 요청이 이루어진 후 헬프 데스크에서 역할을 생성하는 데는 며칠에서 며칠이 걸릴 수 있습니다. 따라서 표준 역할 2 개가 처음 생성되고 User와 Admin, 후속 역할이 애플리케이션 데이터베이스에 저장됩니다 .

  • 이러한 2 개의 표준 역할과 함께 후속 역할 (예 : 수퍼 유저)이 필요합니다. 이러한 역할에는 비즈니스 규칙 등에 따라 다양한 권한이 있으며 응용 프로그램 데이터베이스에 저장해야합니다. 따라서이 시나리오에서는 사용자 지정 역할 공급자를 만들고 적절한 asp.net 역할 테이블을 응용 프로그램 데이터베이스에 추가 한 다음 web.config에 연결해야합니다. 지금까지 내가 사용자 지정 역할 공급자에 필요한 테이블 만 읽은에서

    http://msdn.microsoft.com/en-us/library/9ab2fxh0.aspx

  • 이 역할과 UsersInRoles 있습니다 : 여기에서 비트를 따기있어 역할을 사용하여 권한 부여 관리라는 제목의 MS 페이지입니다 .

    표 역할을 ( Rolename 텍스트 (255) NULL NOT, 가능 ApplicationName 텍스트 (255) NULL NOT, CONSTRAINT PKRoles PRIMARY KEY (Rolename, 가능 ApplicationName) )를 만들

    표 UsersInRoles에게 ( 아이디 CREATE 텍스트 (255) NULL NOT, Rolename 텍스트 (255) NULL NOT, 가능 ApplicationName 텍스트 (255) NULL NOT, CONSTRAINT PKUsersInRoles PRIMARY KEY (사용자 이름, Rolename, 가능 ApplicationName) )

  • 일단이 모든 것이 설정되면 내 앱 데이터베이스에 저장된 사용자 정의 역할을 사용하여 글로벌 데이터 저장소의 2 가지 표준 역할 (사용자 및 관리자)을 병합하는 방법을 알아야하며, 예를 들어 [ 컨트롤러/액션에서 Authorize (Roles = "Admin, Superuser")]를 선택하거나 AuthoriseAttribute를 서브 클래스 화하고 좀 더 영리하게해야합니다.

  • 저는 인증을 위해 AD를 사용할 때 현재 사용자가 속한 역할 모음을 추가/삽입하는 방법이 필요하다는 것을 알았습니다. 따라서 사용자 지정 멤버 자격 공급자 기능은 필요하지 않지만 httpContext.User와 상호 작용하여 역할 컬렉션을 업데이트해야합니다.

+2

시간을 갖고 멋진 대답을하는 것이 정말 좋았습니다. 고맙습니다. –

+0

@EduardoRascon 당신이 유용하다고 생각해서 다행입니다. –

7

인증이 이미 Windows에서 처리되고 있다면 (Active Directory를 통해 추측하고 있습니다), 당신이 찾고있는 것은 권한 부여 메커니즘입니다. 사용자. 한 가지 옵션은 사용자 역할을 성공적으로 한 번 현재 세션에로드하는 것입니다. 그런 다음 현재 세션은 당신이 그럼 당신이

[CustomAuthorization] 
public ActionResult SomeAction() 
{ 
    return View(); 
} 

UPDATE 같은 속성을 사용할 수 있습니다

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited=true, AllowMultiple=true)] 
public class CustomAuthorizationAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    {   
     IPrincipal user = httpContext.User; 
     if (!user.Identity.IsAuthenticated) 
     { 
      return false; 
     } 

    //check your users against a database and return true or false 
     return base.AuthorizeCore(httpContext); 
    } 
} 

와 협력하고 필요한 역할이 있는지 확인합니다 사용자 지정 권한 부여 특성을 만들

AuthorizeCore는이 사용자가 해당 작업 방법에 액세스 할 수 있어야하는지 여부를 확인하는 데 사용되는 방법입니다. 이 메서드 내에서 httpContext.User.Identity.Name 속성을 데이터베이스 또는 역할이 저장된 위치와 비교하여 확인할 수 있습니다. Active Directory를 통해 Windows 인증을 사용하는 경우 HttpContext.User.Identity는 WindowsIdentity

+0

안녕하세요. 이 회사는 사용자 관리/로그온 등을 위해 Active Directory를 사용하지만 다양한 Windows 및 웹 시스템에 대한 역할 관리를 처리하는 별도의 응용 프로그램을 보유하고 있습니다. 주어진 사용자에 대한 역할 목록을 반환하며 저장된 proc를 통해 호출됩니다. 나는 권한 부여 속성을 커스터마이징하는 것에 관한 기사를 보았을 것입니다. 아마도 그 일을 할 수있을 것입니다.하지만 모든 것이 어떻게 달라 지는지에 대한 좋은 고위 수준의 가이드를 찾고 싶습니다. –

+0

또한 AuthorizeCore의 기능은 무엇입니까 ... "데이터베이스에 대해 사용자를 확인"하는 데 어떻게 사용합니까? –

1

RoleProvider와 함께 업데이트 된 RolePrincipal은 인증 된 사용자와 관련된 역할 목록을 가져 오는 데 필요한 모든 것이어야합니다. RolePrincipal에는 이미 적절한 WindowsIdentity가 포함되어 있습니다.

사용자 지정 권한 부여 특성이 필요하지 않습니다. RolePrincipal/RoleProvider는 필요한 역할을 가져오고 표준 Authorize 속성으로 작업합니다.

약간 이상한 점은 응용 프로그램에 고유 한 역할을 원한다는 것이지만 별도의 기업 상점에서도 Windows 사용자와 관련된 역할을 원한다고 말합니다. 말했듯이, 당신은 그들을 병합하고 싶습니다. 이것은 나에게 맞는 것 같지 않다. 기업 수준에서 역할을 관리하려는 경우 또는 로컬 수준에서 역할을 관리하려는 경우. 일반적으로 당신은 둘 다하지 않을 것입니다.

하지만 실제로 그렇게하고 싶다면 RoleProvider가 추가 정보를 얻기 위해 서비스 (예 : WCF) 통화 또는 AD 통화를해야하는 것처럼 들립니다. 아마도 Windows 사용자가 속한 "그룹"의 이름은 "역할"역할을 할 수 있습니다. 그런 다음 응용 프로그램이 신경 쓸 수있는 그룹 만 필터링하고 로컬 역할 데이터베이스에서 찾은 역할과 결합합니다.

모든 정보를 수집했으면 roleManager에 쿠키에 역할 정보를 저장하도록 지시해야합니다. 사용자가하는 모든 요청에 ​​대해 그 음란물을 통과하는 것은 의미가 없습니다.