次のテスト設定があり、すべて機能しています。
-MathService.svc を実行する WCF アプリケーション、SimpleMembershipProvider を使用するためのセットアップ
-デフォルトの SimpleMembershipProvider を使用する MVC 4 インターネット アプリ
- メンバーシップは次のとおりです。
- 3 つの役割: 「デバッグ」、「管理者」、「編集者」
- 2 ユーザー: ロール デバッグおよび管理者の「デバッグ」(ya、ロール デバッグのユーザー デバッグ)
- ロール管理者の「管理者」
-証明書、機能しているとわかる限り、wshttpを使用してサービスに接続できます
サービス方法コード。
//[PrincipalPermission(SecurityAction.Demand, Role = "Debug")]
public string Add(double A, double B)
{
OperationContext oc = OperationContext.Current;
ServiceSecurityContext ssc = oc.ServiceSecurityContext;
string cltName = ssc.PrimaryIdentity.Name; //cltName = "Debug"
var Rs = Roles.GetAllRoles(); //returns: 'Debug', 'Administrator', 'Editor' => OK
var dUsers = Roles.GetUsersInRole("Debug"); // 'Debug' => Expected
var aUsers = Roles.GetUsersInRole("Administrator"); // 'Debug', 'Admin' => expected
try
{
var a = Roles.GetRolesForUser(cltName); //this fails
var b = Roles.IsUserInRole(cltName, "Debug"); //this fails
var c = Roles.IsUserInRole(cltName, "Administrator"); //this fails
}
catch (Exception err)
{
string p = err.Message; // all fail with error :
// "Object reference not set to an instance of an object", inner exception=null
}
if (dUsers.Contains(cltName)) //this works, but requires extra step
//I should be able to us if(Roles.IsUserInRole(cltName, "Debug"))... here?!?
{
return string.Format("Result: {0}", (A + B).ToString("N2"));
}
else
{ //this is just to get a different result if NOT in role 'Debug'
return string.Format("Result: {0}", ((int)A + (int)B).ToString("N2"));
}
}
「Roles.GetRolesForUser(cltName)」および IsUserInRole の呼び出しが失敗するのはなぜですか?
「ServiceSecurityContext」から正しいユーザー名を取得します。[PrincipalPermission] 属性を有効にすると、ユーザー Admin でサービスを呼び出すと、予想どおり拒否されます。
では、なぜ PrincipalPermission は正しいユーザー ロールを取得できるのでしょうか? Roles.GetUsersInRole("Debug") を使用して正しいユーザーをすべて取得できるのに、Roles.IsUserInRole(..) を呼び出せないのはなぜですか?
証明書 / /membership のセットアップ エラーを示唆する投稿がいくつかありますが、これまでにどのように取得でき、セットアップが間違っているのかわかりません。何よりも、すべてではなく、一部のロール メソッドが失敗するだけです。ポインタはありますか?
返された結果について一言。ロールの回避策を使用してデバッグ経由で呼び出すと、サービスは倍精度を返します。管理者 [PrincipalPermission] を無効にして呼び出すと、整数精度が返されます。
よろしく、 アンドレアス