0

UserID と User Role に応じて true または false を返す関数があります。

いくつかのアクション結果を持つコントローラーがあります。

例えば

  public class DemoController : Controller
  {
     public ActionResult Index(){}

     public ActionResult Contact(){}
  }

したがって、ユーザーがこのアクションを使用するたびに、ユーザーが役割を果たしているかどうかを確認したいと思います。

私はそれを好きにすることができることを知っています

[Authorize(Roles = "Administrator")]
public ActionResult JustAdmins(){}

しかし、このような方法では、ユーザーがこのアクションにアクセスするたびに、余分な SQL クエリが発生します。

ユーザーロールをMemCachedに保存したいので、関数は次のようになります

 public static bool IsCompany(Guid UserID)
 {

    //if (get from cache != null && get from cache == "Role")
    // return true
    //if (get from DB != null && get from DB == "Role")
    //return true

    return false;
 }

しかし、この関数をチェックするためにコントローラーのすべてのアクションを継承するにはどうすればよいですか?

ヒント: OnActionExecuting などをオーバーライドする可能性がありますか?

4

1 に答える 1

1

RoleProviderデフォルトのものから継承するカスタムを作成し、 GetRolesForUserメソッドをオーバーライドできます。

public class CachingRoleProvider: THE_ROLE_PROVIDER_YOU_ARE_CURRENTLY_USING
{
    public override string[] GetRolesForUser(string username)
    {
        string[] roles;
        if (TryCheckFromYourCacheIfUserIsInRole(username, out roles))
        {
            // the roles for this user were retrieved from the cache
            return roles;
        }

        // no roles retrieved from the cached => query the base role provider
        roles = base.GetRolesForUser(username);

        // Store the retrieved roles into the cache so that on subsequent calls
        // you no longer need hit the base role provider for this user
        PutRoleInCacheForUser(username, roles);

        return roles;
    }
}

明らかにこれを行うことで、データストアからではなく、キャッシュされたロールを読み取っているため、外部プロセスが基本ロール プロバイダーによって使用されるデータストア内のロールを変更した場合、同期が取れなくなる可能性があるという事実を完全に認識できます。したがって、この場合、特定のユーザー名のキャッシュされたデータを削除するために、いくつかの同期メカニズムを配置する必要がある場合があります。

于 2012-08-18T17:19:25.803 に答える