2010-04-27 7 views
1

저는 IIdentity를 구현하는 고유 한 사용자 정의 Identity 클래스를 작성하고 있습니다. 기본 메서드 인 IsAuthenticated를 변경할 필요가 없지만 이제는 true 또는 false를 반환해야하는지 여부를 기본 IIdentity가 어떻게 결정하는지 궁금합니다.Asp.net 보안 : IIdentity.IsAuthenticated 기본 구현

제가 사용하고있는 FormsAuthenticationTicket에서 대답을 찾을 수 있을지는 모르겠지만 그게 맞는지는 확실하지 않습니다. 사전에

감사합니다,

Pickels

답변

6

ASP.Net 처리기의 맥락에는 '기본 IIdentity가'없다.

는 ASP.Net 처리기의 기본 UserGenericPrincipal에 전달하는 GenericIdentity있다, 그것은 행동이 비어 있지 않은 이름으로 인스턴스화하는 경우 다음이 인증이다입니다.

말했다

public virtual bool IsAuthenticated 
{ 
    get 
    { 
     return !this.m_name.Equals(""); 
    } 
} 

는 IsAuthenticated는의 결정이 완전히 임의 및 IIdentity를 구현하는 클래스는이 논리를 구현하기위한 완전히 책임이있다.

일반적으로, 이것은 asp.net 런타임에 의해 자동으로 수행 될 때, 따라서 true가 적절한해야한다 반환 IsAuthenticated는 '바보'와 함께 사용자 정의 IIdentity을 구현, 미 인증 주체/정체성의 인스턴스에 대한 사용 사례가 없다 대부분의 경우. 또한

, 완전히 IPrincipalIIdentity이 사소한 구현하는 동안, 당신은 단순히 당신이 유지 보수하는 데 필요한 코드의 양을 감소 GenericPrincipalGenericIdentity에서 파생 할 수있다. FormsAuthentication의 맥락에서

사용자가 인증되는 경우에만 티켓이되고 User 유형 FormsIdentity의 신원과 RolePrincipal의 인스턴스가 될 것이며,이 IsAuthenticated의 구현이다는 ... ;-)

매우 복잡
public bool IsAuthenticated 
{ 
    get 
    { 
     return true; 
    } 
} 

희망을 정리하는 데 도움이됩니다.

+0

GenericIdentity에서 파생시키는 것이 좋습니다. 이 답변을 쓸 시간을내어 주셔서 감사합니다. – Pickels

+1

@Pickels - FormsAuthentication과 함께 사용자 지정 주체/ID를 사용할 계획이라면 RolePrincipal 및 FormsIdentity에서 파생 될 가능성을 조사 할 수 있습니다. 기본 제공되는 모든 기본 제공 업체가 이에 해당합니다. 물론 자신의 공급자 스택을 구현하지 않는 한 모든 베팅이 해제되며 원하는대로 자유롭게 수행 할 수 있습니다. –

+0

나는 생각하는 모든 공급자를 사용하지 않을 것이다. 나는 그것을 OpenID와 함께 사용하고 MongoDB 안에 저장하려고한다. IIdentity를 사용하여 몇 가지 테스트를 수행하여 일부 사용자 정보 (친숙한 식별자, ObjectId, 전자 메일 등)에 쉽게 액세스했습니다. – Pickels

2

UserPrinciple 사용자 지정을 사용하면 GenericPrinciple 표준이 허용하는 것보다 현재 사용자에 대한 자세한 정보를 내 페이지에 포함시킬 수 있습니다. 당신이 쉽게 내 패션과 비슷한 FormsIdentity 내장되어 활용할 수있는 내 자신을 구현할 필요가 찾지 못했습니다 (이것은 Auth에 대한 표준 관행에서 분기하는 경우 잘 모르겠습니다. 그래도). 나는 사용자 정의 GuestIdentity을 작성하여 하드 코드 된 IsAuthenticated = false을 아마도 이것을 GenericPrinciple으로 대체 할 수 있습니다. 추상적인지 아닌지는 분명하지 않습니다.

public class UserPrincipal : IPrincipal 
{    

    private readonly IIdentity _identity; 

    public UserPrincipal() 
     { 
      _identity = new GuestIdentity(); 

      var guest = //my custom object 
      User = guest; 
     }   
    public UserPrincipal(HttpContext context) 
    { 
     var ident = context.User.Identity as FormsIdentity; 
     string msg1 = "Context.User.Identity is null for authenticated user."; 
     if (ident == null) throw new ApplicationException(msg1); 

     _identity = ident; 
     string msg2 = "Forms Identity Ticket is null"; 
     if (ident.Ticket == null) throw new AccessViolationException(msg2); 

     var userData = ident.Ticket.UserData; 

     ... 

     User = jsonSerializer.Deserialize<User>(userJson); 
    }  
    #region IPrincipal Members 
    public bool IsInRole(string role) 
    { 
     return User.Roles.FirstOrDefault(x => x.RoleName == role) != null; 
    } 

    public IIdentity Identity 
    { 
     get { return _identity; } 
    } 
    #endregion 
} 

랜덤 옆으로, 당신은 당신이 생각의이 유형을 따르는 경우에 비록 당신이이 클라이언트에 저장된 때문에 제대로 오래된 데이터를 만료 될 수 있습니다 장소에 논리를 가지고 있는지 확인, 확장 UserData를 같은 폼 인증 티켓의 데이터를 캐시 할 수 있습니다 컴퓨터.

+0

올바르게 이해하면 userData를 Json으로 저장합니다. 그것을 수업 시간에 사용하는 것도 좋은 생각입니다. – Pickels

+0

나는 여기에서 내 코드에서 더 많은 가지 치기를 생각했지만, 다른 사람들이 그것을 고려하는 것이 유용 할 수 있다는 것을 깨달았다. 어떤 시점에서 나는 아마도 내 대답을 추가로 계층화하고 결과를 서버에 캐시하고 만료 된 캐시 된 값에 대한 티켓을 deserialize합니다. –

+2

@Pickels - 쿠키의 JSON에주의하십시오. 먼저 전체 JSON 문자열을','로 UrlEncode해야하고 다른 쿠키는 쿠키를 끊어야합니다. 이제 암호화가 끝난 4K 쿠키 제한을 염두에 두어야합니다.이 제한은 암호화 후에 암호화 전 전체 쿠키에 대해 약 1.8kb의 사용 가능한 공간입니다. 쿠키가 조용히 잘 리도록 조심하십시오. 정당한 이유없이 쿠키를 해독하고 버그를 발견하면 36 시간 안에 그림자 남자를 보게 될 것입니다. <- 경험의 목소리. –