1

編集: WCF サービスが SSL に移動されると、SSL PrincipalPermission.Demand()を使用しているため、問題は以下の問題に関連している可能性があると思います

私は安全な一連の Web サービスに取り組んでおり、ユーザーを認証するために 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 を返し、フォーム認証 Cookie を設定するかどうかを確認します。

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

次のように、Web構成でサービス承認を設定しました。

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

どんな助けでも大歓迎です、ありがとう

編集:

この問題をさらに調査したところ、プリンシパルが正しく設定されていることがわかりました。私は次の 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 を返します。

4

1 に答える 1

1

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

サービスクラスのコンストラクターで、Thread.CurrentPrincipal = HttpContext.Current.Userを設定すると、正しく一致するようになります。次に、principalpermission属性は、期待どおりにブロック/許可します。

于 2012-08-10T15:26:33.277 に答える