5

次のテスト設定があり、すべて機能しています。

-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] を無効にして呼び出すと、整数精度が返されます。

よろしく、 アンドレアス

4

1 に答える 1

4

誰かが同じ問題に遭遇した場合に備えて。

「古い」ASP.net RolesProvider を simpleMembership で使用できますが、それらは同じではありません。

私の場合、単純なキャストを追加する必要がありました。

var _simpleRoles = (SimpleRoleProvider)Roles.Provider; //need the cast to simple

そして、これは機能します

 var b = simpleRoles.IsUserInRole(cltName, "Debug"); 
于 2012-12-16T03:20:19.417 に答える