編集: 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 を返します。