2012-06-08 2 views
4

MVC3에서 간단한 작업을 수행하려고합니다.폼 인증을 사용하는 MVC3의 간단한 인증

타사 SSO로 사용자를 인증하는 데 폼 인증을 사용하는 응용 프로그램이 있습니다. 로그인 성공시, SSO는 내 응용 프로그램의 특정 컨트롤러 작업으로 다시 게시됩니다. 그런 다음 FormsAuthentication.SetAuthCookie(user,false);으로 전화하십시오.

일부 권한 부여를 구현하려고합니다. 간단히 말해, 사용자는 여러 가지 역할 (예 : AdminDeveloper. 일부 컨트롤러 작업은 특정 역할에서만 사용할 수 있어야합니다. 사용자가 속한 역할에 대한 세부 정보는 간단한 외부 JSON 응답을 나타내는 다른 외부 API를 호출하여 얻을 수 있습니다. 그러나

string[] rolelist = GetRoleListForUserFromAPI(User.Identity.Name); 
HttpContext.User = new GenericPrincipal(User.Identity, rolelist); 

, 내가 직접 SetAuthCookie를 호출 한 후이를 호출 할 수 없습니다 HttpContext.User 아무것도하지 않기 때문에, : 내가하고 FormsAuthentication 쿠키를 설정 한 후

은 이론적으로,이 같은 일을하는 것만 큼 간단해야한다 이 시점에서 의미가 있습니다.

모든 요청에서이 값을 설정할 수는 있지만 앱에 대한 요청은 왕복 API 호출을 의미합니다.

public override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    if (<some way of checking if roles have already been set for this user, or role cache has timed out>) 
    { 
     string[] rolelist = GetRoleListForUserFromAPI(filterContext.HttpContext.User.Identity.Name); 
     filterContext.HttpContext.User = new GenericPrincipal(filterContext.HttpContext.User.Identity,rolelist); 
    } 
} 

내가 다음을 위해 컨트롤러 액션의 앞에 [MyCustomAuthorization(Roles="Admin")]을 사용할 수

내가 지금까지 본 중에 가장 유망한 방법은 사용자 정의 인증 속성을 생성하고이 같은 뭔가를 OnAuthorization을 무시하는 것입니다 마술이 일어난다.

그러나 현재 HttpContext.User 개체의 역할이 설정되었는지 여부 또는 특정 시간 전에 설정되어 있고 다른 API 여행이 필요한지 여부를 감지하는 방법을 알지 못합니다.

이 용도로 가장 적합한 방법은 무엇입니까?

+0

좋은 질문 .... –

답변

1

내 첫 번째 생각은 사용자 지정 역할 공급자 구현을 조사해야한다는 것입니다. 이것은 잔인 할 수도 있지만 역할 기반 배관에 적합 할 것 같습니다.

자세한 정보는 MSDN here에서 확인할 수 있습니다.

+0

처음에는 그렇게 보일지 모르지만 실제로는 나쁜 접근 방법이 아닙니다. 클래스를 만들고 RoleProvider에서 상속 받고 API를 호출하여 역할 정보를 얻는 두 가지 메소드를 구현하는 것은 매우 간단했습니다. 중간에있는 간단한 캐싱과 오히려 잘 작동하는 것 같습니다. 추가 된 보너스는 별도의 dll을 가져 와서이 특정 API에 대해 권한을 부여하려는 모든 앱에 nuget을 통해 배포 할 수 있다는 것입니다. – growse

2

당신은 PostAuthenticateRequest

protected void Application_OnPostAuthenticateRequest(object sender, EventArgs e) 
{ 
    if (HttpContext.Current.User.Identity.IsAuthenticated) 
    { 
     string[] rolelist = GetRoleListForUserFromAPI(User.Identity.Name); 
     HttpContext.User = new GenericPrincipal(User.Identity, rolelist); 
    } 
} 

이 그것은이 처리의와 폼 인증이 완료된 후 호출 것 오버라이드 (override) 할 필요가 있습니다. 업데이트

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

나는 (내 자신의 응용 프로그램 중 하나 체크) 잘못된 방법 서명을했다.

+0

Brb, 이것에 대한 몇 가지 테스트를 수행합니다. :) – growse

+0

@jgauffin -이게 재미있어 보이지만이 정보가 후속 요청에서 어떻게 지속되는지 궁금합니다. –

+0

여기에 계속있는 것처럼 보이는데,'MasterAdmin : @ User.Identity.IsInRole ("Admin")'을'Master.cshtml'에 두는 것은 각 페이지에서'True'라고 말합니다. – growse

2

또 다른 방법은 FormsAuthentcationTicket의 UserData 속성에 역할을 저장하는 것입니다. 이 작업은 쉼표로 구분 된 문자열로 수행 할 수 있습니다.

http://msdn.microsoft.com/en-us/library/system.web.security.formsauthenticationticket.formsauthenticationticket

다음에 대해 AuthenticateRequest 방법에, 당신은 다시 티켓을 당겨 역할 데이터를 잡고 일반적인 주체를 사용하여 현재 사용자에게 할당 할 수 있습니다.

+0

이것은 좋은 생각입니다. 사용자 세션 동안 (예 : 매 5 분마다) 역할 목록을 한 번 이상 새로 고치려면 캐싱 시간 초과 값을 저장할 수 있습니다. – growse

1

세션 객체 ISNT는 많은 사람들에게 큰 상상을 안겨줍니다. 임시 데이터를 사용하는 경우 이미 세션에서 히트를 기록한 것입니다.

이 데이터를 쿠키에 저장하면 양식 인증 토큰이 1 년 6 개월 전 POET 취약점에서 이미 악용되어 사용자가 "admin" 그 취약점은 그 취약점을 사용합니다.

@jgauffin이 언급 한 것처럼 게시 인증에서이 작업을 수행 할 수 있습니다. 세션 상태를 사용할 수없는 경우 Application_PreRequestHandlerExecute에서 세션 상태를 사용하여 확인할 수 있습니다. 당신이 세션 상태에서 사용할 수 있는지 확인 중 하나에 내 코드를보고 싶다면

은 : 인증 형태와 세션을 사용할 때마다 또한 How can I handle forms authentication timeout exceptions in ASP.NET?

, 당신은 항상 시간 제한 (서로 동기화되어 있는지 확인하려면 위의 코드를 다시 참조하십시오)

관련 문제