0

認証されたらHttpContext.Current.User.Identity.Name;、ユーザーがサイトの一部を表示する権限があることを確認するために使用します。

サイトの特定の部分にアクセスするとき、ユーザーを取得し、どのコンテキスト (ログインしている組織) を取得する必要があります。urlは次のようになりsettings/supercompany/profileます。ここで、supercompanyは現在のコンテキストです。

ユーザーごとに、その会社の管理者か一般ユーザーかを確認する必要があります。一般ユーザーの場合、特定のものを見ることができません。

public class SettingsApi
{
    private readonly string _userId;
    private readonly string _contextId;

    public SettingsApi(string userId, string contextId)
    {
        _userId = userId;
        _contextId = contextId;
    }
}

上記のクラスをコントローラー (post または get) からインスタンス化すると、キャッシュによって何らかの問題が発生しますか? ユーザーの役割が変更されましたが、それを取得しませんか? 以下のようなものはうまくいきますか?

var settings = new SettingsApi(HttpContext.Current.User.Identity.Name, currentContextId);
settings.IsAdmin();

注: 属性を使用して承認することもできますが、私の要件は、URL から currentContext を選択する必要があることと、コードの他の場所で上記のクラスを使用する必要があることです。

アップデート

AuthorizeAttributeはキャッシングでうまく機能しますが、認証に使用される方法はつまり

    protected override bool AuthorizeCore(HttpContextBase httpContext)

必要なクラスのインスタンスを返してくれません...

更新 2とにかく、このクラスまたはこのクラスのインスタンスをキャッシュしたくないので、新しいインスタンスを要求するたびに、DB からインスタンスを取得してもかまいません...

私の質問 - 私のコーディング方法は大丈夫ですか? ユーザーとその権限はキャッシュされませんか?

4

2 に答える 2

0

注意しないと、認証されたユーザーによる最初のリクエストの出力をMVCにキャッシュさせることができます。VaryByCustomと現在のIDの名前を使用します。

[OutputCache(VaryByCustom="user")]
public class SomeController : Controller
{
  // etc.
}

私のGlobal.asax.csで私は定義します:

public override string GetVaryByCustomString(HttpContext context, string custom)
{
    if (custom.Equals("user", StringComparison.OrdinalIgnoreCase))
    {
        return context.User.Identity.IsAuthenticated ? context.User.Identity.Name : string.Empty;
    }
    return base.GetVaryByCustomString(context, custom);
}
于 2012-05-21T09:55:34.180 に答える
0

SettingsApi のインスタンスをキャッシュに追加することを提案している場合、キャッシュはアプリ全体であり、すべてのユーザーが同じ SettingsApi を共有することになるため、確実に機能しません。OutputCache を使用しても問題ありません (非表示フィールドにユーザー ID を入力して [OutputCache(VaryByCustom="user")] などを使用しない限り)。

SettingsApi をキャッシュする場合は、ユーザー/セッションごとの SessionState を介して行う必要があり、認証には影響しません。

于 2012-05-21T09:58:47.963 に答える