2009-08-19 2 views
14

나는이 프로젝트에서 관리자 사용자의 로컬 db를 유지하고 일반 사용자를 위해 외부 db를 사용해야한다고 요구합니다. admin db에 인증을 통과 한 사람에게는 'admin'역할을 할당하고 다른 db를 통해 인증 된 사람에게는 항상 'user'역할을 할당해야합니다.ASP.NET MVC에서 수동으로 사용자 역할을 설정하는 방법은 무엇입니까?

이러한 역할을 수동으로 할당 할 수 있습니까? 나는 역할 공급자 나 어떤 것의 복잡성을 필요로하지 않는다. 왜냐하면 나는이 두 가지 역할을 항상 사용하고 있기 때문이다.

샘플 코드 나 일부 문서에 대한 링크를 제공 할 수 있다면 큰 도움이 될 것입니다. 감사!

편집 :

은 현재 내가 역할 공급자를 사용하여 생성하고 있지 않다 하나는 번거 로움처럼 보인다. 나는 'best-practice'가 아니라는 것을 알고 있지만 로그인하는 동안 2 가지 역할 중 하나만 지정하면됩니다. 또한 사용자가 이미 자신의 역할에 따라 2 dbs로 분리되어 있기 때문에 데이터베이스에 역할 정보를 저장하는 것은 의미가 없습니다.

if (AdminDB.ValidateUser(username,password)==true) { 
    SetAuthCookie(username); 
    AssociateUserWithRole(username, 'admin'); 
} elseif (UserDB.ValidateUser(username,password)==true) { 
    SetAuthCookie(username); 
    AssociateUserWithRole(username, 'user'); 
} else { 
    // Login failed. 
} 

그것은 'ThisSession.AssociateUserWithRole'부분 모르겠어요 :

는 여기에 몇 가지 의사 코드입니다. 기본적으로 사용자 중 하나가 인증되므로 .NET에 사용자가 속한 역할을 알릴 필요가 있습니다.

답변

15

Implementing a role provider 특히 역할 관리가 아닌 역할 확인 만 구현하는 경우 특히 그렇습니다. 필요한 부분 만 구현하고 나머지는 NotImplementedExceptions를 던져 주면됩니다. 하나의 응용 프로그램 만 가지고 있다면 그 부분에 대해서도 걱정할 필요가 없습니다. 필요한 부분은 프레임 워크가 사용하는 방법이 아니라 사용 방법에 따라 달라집니다. 예를 들어, 특정 역할에 속하는지 만 확인하려는 경우에도 모든 사용자의 역할을 반환하는 비트를 구현해야한다고 생각합니다.

즉, 전체 RoleProvider를 생략하고 세션에서 모든 작업을 수행 할 수 있습니다.이 경우 자신의 AuthorizeAttribute을 구현하고 인증 및 역할 확인 비트를 자신의 것으로 대체하십시오. 일단 인증 된 세션에 사용자의 역할을 저장하고 속성 및 속성으로 제공 한 매개 변수를 사용하여 장식 한 메서드/클래스의 속성을 확인하십시오. 역할 기반 보안이

사용자 권한 부여 : 명확하게 (NerdDinner가하는 것과 유사) 사용자에게 역할을 할당하고, 모든 요청에 ​​주체를 교체하는 과정을 설명합니다 (2003 있지만)

+0

커스텀 AuthorizeAttribute가 가장 이해하기 쉽습니다 (PHP-land의 .NET MVC noob). 도와 주셔서 감사합니다!! –

+0

'Session'을 this로 사용 하시겠습니까? : login->'Session.Add ("LoggedInRole", "admin"); 그리고 현재 사용자의 유형이 필요할 때'Session'에서 읽으십시오. 'Session'은 사용자 유형 (역할)을 저장할만큼 안전합니까? –

+1

@MajidR'Session'은 일반적으로 모든 서버 측이므로 침입 관점에서 역할 공급자보다 덜 안전합니다. 분명히 모든 논리를 직접 코드화해야하므로 견고성 관점에서 볼 때 논리에 의존하게됩니다. 아마'RoleProvider' 라우트로 갈 것입니다. – tvanfosson

6

그런 다음 AddUserToRole 및 RemoveUserFromRole 볼 & 역할이 asp.net에 내장 된 멤버십을 사용하는 경우 :

http://msdn.microsoft.com/en-us/library/system.web.security.roles.addusertorole.aspx

그들이 당신을 추가하고 필요에 따라 제거 할 수 있습니다 로그인하는 방법을 기준으로합니다.

역할 공급자를 사용하지 않거나 자신의 역할 공급자를 만들지 않으려는 경우 게시물에서 알 수 없습니다. 기본 제공 역할 공급자를 사용하지 않는 경우 사용자가 로그인하는 방법/위치에 따라 로그인시 사용자를 전환 할 수있는 코딩 메커니즘을 사용해야합니다.

편집 : 코드를 표시하고 asp.net 역할 엔진을 사용하지 않는다고 했으므로

표시되는 양식 인증 쿠키를 사용하고 있으므로 global.asax 파일의 authenticateRequest를 무시하고 필요에 따라 역할을 설정하고 티켓을 만듭니다.

여기에 샘플입니다 : http://csharpdotnetfreak.blogspot.com/2009/02/formsauthentication-ticket-roles-aspnet.html

샘플은 "얻는다"역할하지만 당신은 추가/여기에 역할을 변경할 수 있습니다.

+0

나는 생각한다. 그래도 도와 ​​줘서 고마워! 감사합니다. –

1

사람이 OWIN과 같은 문제가 발생하면 , 난이 도움이 될 것 같아요 : tvanfosson의 솔루션은 내가 필요에 가장 적합한 것 @

var identityResult = await manager.CreateIdentityAsync(login, "MyAppCookie"); 

if (<user is admin>) 
    identityResult.AddClaim(new System.Security.Claims.Claim(identityResult.RoleClaimType, "Admin")); 
else 
    identityResult.AddClaim(new System.Security.Claims.Claim(identityResult.RoleClaimType, "User")); 

HttpContext.Current.GetOwinContext().Authentication.SignIn(identityResult); 
관련 문제