2009-05-04 3 views

답변

2

현재 사용자에 대해 프로그래밍 방식으로 세부 정보를 제공하려는 Identity의 구체적인 구현으로 GenericIdentity를 사용할 수 있습니다. 다른 채널을 통해 사용자를 직접 확인하고 인증 한 경우 유용합니다.

+1

pls 설명하고 있지만 'GenericIdentity'에서 상속 한 클래스의'.IsAuthenticated' 속성을 프로그래밍 방식으로 설정할 수는 없습니다. 오류가 발생합니다 : '속성 또는 인덱서'System.Security.Claims.ClaimsIdentity.IsAuthenticated '를 할당 할 수 없습니다 - 읽기 전용입니다. 어떤 아이디어입니까? – atconway

+1

대신 클래스에'IIdentity'를 구현하여이 문제를 해결하고 이러한 속성을 직접 구현했습니다. – atconway

45

GenericPrincipal은 사용자를 "주체"로 설명하는 가장 간단한 방법입니다.

string[] roles = { "User", "Admin" }; 
    Thread.CurrentPrincipal = new GenericPrincipal(
     new GenericIdentity("Fred"), roles); 

당신은 시점에서이 작업을 수행 할 수 있습니다 사용자가 "사용자"와 "관리자"권한 "프레드"로 로그인 할 경우, 즉 -이 응용 프로그램에서 검사를 구현 인식 보안을 위해 사용할 수 있습니다 winform에 대한 클라이언트 로그인 또는 WCF, ASP.NET 등에서이 작업을 수행하는 특정 지점이 있습니다.

그런 다음 나중에 코드를 에 대한 액세스 권한을 확인하지 않고도이 권한을 확인할 수 있습니다. IsInRole 또는 선언적으로 :

[PrincipalPermission(SecurityAction.Demand, Role = "Admin")] 
void SomeAdminFunction() { } 

row.UpdatedBy = MyUtilityClass.GetUsername(); 

GenericPrincipal이의 간단한 경우에 유용합니다 :

public static string GetUsername() { 
    IPrincipal principal = Thread.CurrentPrincipal; 
    IIdentity identity = principal == null ? null : principal.Identity; 
    return identity == null ? null : identity.Name; 
} 
public static bool IsInRole(string role) { 
    IPrincipal principal = Thread.CurrentPrincipal; 
    return principal == null ? false : principal.IsInRole(role); 
} 

그런 다음 당신은 당신의 DAL 일부 감사 코드가있을 수 있습니다 : 여기

몇 가지 유용한 유틸리티 코드는 교장/정체성 주위에 널 안전 래퍼입니다 일반 사용자 이름 및 알려진 역할 세트 더 복잡한 기본 구현은 예를 들어 "필요시"액세스 확인을 수행 할 수 있습니다. 즉, 모르는 "Foo"역할을 요청할 때까지는 (웹 서비스, 데이터베이스, 활성 디렉토리 등)에 저장하고 나중에 액세스 할 수 있도록 결과를 캐시합니다. 잠재적 역할 목록이 크고 일반적으로 에 쿼리되는 역할의 수가 적은 경우 유용합니다.

보안 주체를 사용하여 특정 컨텍스트 (예 : 보안 토큰)에만 필요한 추가 ID 정보를 저장할 수도 있습니다. 발신자는 보조 데이터가 지원되는지 확인하기 위해 교장을 as으로 테스트 할 수 있습니다.

"principal"을 사용하면 논리 처리 코드가 winforms, ASP.NET, WCF, Windows 서비스 등이 아닌 신원을 말할 수 있기 때문에 유용합니다. 이는 추상적입니다. 또한 일부 제 3 자 코드는 또한 교장에게 말할 것입니다.

또 다른 예로서 나는 디자이너를 통해 winform 컨트롤에 대한 액세스를 제어하는 ​​방법을 보여주는 일부 example code here을 작성했습니다 (IExtenderProvider - VS에서 속성 표에 추가 항목을 넣음).

+0

PrincipalPermission 특성은 어떻게 작동합니까? 메서드 호출시 Thread.CurrentPrincipal에 올바른 역할이 포함되지 않은 경우 예외가 발생합니까? – Svish

+1

@Svish - 정확히 ('SecurityException'); 런타임이 직접 작용하는 (거의) 속성 중 하나입니다. –

0

GenericIdentity 클래스 : - GenericIdentity 클래스는 IIdentity 인터페이스를 구현합니다.응용 프로그램에서 정의한 사용자 지정 인증 방법을 기반으로 사용자의 ID를 나타냅니다. GenericPrincipal 클래스 : - GenericPrincipal 클래스는 IPrincipal 인터페이스를 구현합니다. 이는 Windows 사용자 및 해당 역할과 독립적으로 존재하는 사용자 및 역할을 나타냅니다. 기본적으로 일반 원칙은 응용 프로그램 인증 및 권한 부여를위한 간단한 솔루션입니다.