1

編集:私は私、私は、Webサービスの安全なセットに働いている問題は、私はまた、SSL PrincipalPermission.Demand() failing once WCF Service was moved to SSLWCF CustomRoleProvider原則権限

を使用しているとして、以下の問題に関連することができることを考えますユーザーを認証するためにCustomRoleProviderとCustomMembershipProviderを実装しました。

これはうまくいきますが、ユーザーが認証されていない場合は、ほとんどのサービス呼び出しへのアクセスを制限したいと考えています。

私はこの

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

を達成するために、次を使用して、計画

しかし、これは、ユーザーが認証されたときを検出していないようですし、常にセキュリティ例外がスローされます。私は間違ったことを本当に確信していません。メンバシッププロバイダはtrueを返し、フォーム認証Cookieを設定した場合、私の認証サービスコール内

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; 
      } 
     } 
    } 

は、私が確認してください。

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

任意の助けをいただければ幸いです、おかげで

EDIT:

私がやった、次のように私は私のウェブの設定でサービスの認可を設定した

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

問題の詳細な調査を行い、プリンシパルが正しく設定されていることを発見しました。 私は以下のServiceメソッドを持っています。その中にプリンシパルを取得し、ユーザーが正しいロールにいるかどうかを確認し、開始時のタグが効果的にやっていることを確認します。

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

このメソッドは現在、最初にプリンシパルのアクセス許可をコメントアウトすると常にSecurityExceptionをスローしますが、このメソッドは機能し、trueを返します。

答えて

1

PrincipalPermissionは、HttpContext.Current.UserではなくThread.CurrentPrincipalをチェックします。そのため、Principalmission属性でDoWork()がコメントアウトされてtrueを返しますが、その行にfalseが返されます(Thread.CurrentPrincipalは何かに設定)。

私のサービスクラスのコンストラクタで、Thread.CurrentPrincipal = HttpContext.Current.Userを設定しましたが、今度は正しく一致します。 principalpermission属性は、期待通りにブロック/許可されます。