1

편집 : 나는 또한 내가 웹 서비스의 보안 설정에서 일하고 있어요 SSL PrincipalPermission.Demand() failing once WCF Service was moved to SSLWCF CustomRoleProvider 및 원리 권한

을 사용하고 다음과 같이 나는이 문제가이 문제에 관련이있을 수 있다고 생각 사용자를 인증하기 위해 CustomRoleProvider와 CustomMembershipProvider를 구현했습니다.

이 방법이 유용하지만 사용자가 인증되지 않은 경우 대다수의 서비스 호출에 대한 액세스를 제한하고 싶습니다.

내가 그러나이

[PrincipalPermission(SecurityAction.Demand, Authenticated=true)] 

을 달성하기 위해 다음과 같은 사용에 대한 계획, 이것은 사용자가 인증하고 항상 보안 예외가 발생하면 감지하지 않는 것 같습니다. 나는 내가 뭘 잘못했는지 정말로 모른다.

public class CustomMembershipProvider : MembershipProvider 
{ 
    public string UserType; 

    public override bool ValidateUser(string username, string password) 
    { 
      //Custom logic to work out if user exists and password is correct 

      //If the user exists and password matches we will get a populated user 
      //object containing their username and usertype 

      if (user == null) 
      { 
       return false; 
      } 
      else 
      { 
       return true; 
      } 
     } 
    } 

내 인증 서비스 호출 내에서 멤버 자격 공급자가 true를 반환하고 폼 인증 쿠키를 설정하는지 확인합니다. 다음과 같이

 if (Membership.ValidateUser(username, password)) 
     { 
      FormsAuthentication.SetAuthCookie(username, false); 
     } 

내 웹 설정에서 서비스 권한을 설정 한 : 어떤 도움을 크게 감상 할 수

<behavior name="SecureAuthServiceBehavior"> 
     <serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="CustomRoleProvider"/> 
     .... 
    </behaviour> 

, 감사

편집 :

나는 짓을했는지 이 문제에 대한 추가 조사를 실시하고 교장이 올바르게 설정되었음을 발견했습니다. 다음 서비스 메소드가 있습니다. 그 중 Principal을 가져 와서 사용자가 올바른 역할을하고 있는지 확인하여 처음에 태그가 수행하는 작업을 효과적으로 수행합니다. 나는 시작에 주요 권한을 주석 경우

[PrincipalPermission(SecurityAction.Demand,Role="A")] 
public bool DoWork() 
{ 
    IPrincipal p = HttpContext.Current.User; 
    if (p.IsInRole("A")) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

이 방법은 현재이 방법이 작동하고 true를 반환 할 때마다 그러나, SecurityException를 슬로우합니다.

답변

1

PrincipalPermission은 HttpContext.Current.User가 아닌 Thread.CurrentPrincipal을 검사합니다. 따라서 Principalmission 속성이 DoWork()를 주석 처리하여 true를 반환하지만 그 줄은 false를 반환합니다 (Thread.CurrentPrincipal이 아무것도 설정하지 않음).

내 서비스 클래스의 생성자에서 Thread.CurrentPrincipal = HttpContext.Current.User를 설정하고 올바르게 일치시킵니다. principalpermission 속성은 예상대로 블록화/허용합니다.