web-dev-qa-db-ja.com

カスタム許可属性

私は自分のメンバーシップシステムを構築していますが、MSメンバーシッププロバイダーとは何の関係もありません。私はインターネットとここStackOverflowを見回しましたが、MSメンバーシッププロバイダーの上に構築されたメンバーシッププロバイダーしか見つかりませんでした。

とにかく、今ではほとんどすべてが接続されていますが、メンバーシップインフラストラクチャを利用するカスタムのAuthorize属性を使用したいと思います。私はチェックアウトしました this ここのスレッドで、ここで同様のことを実行しようとしていますが、それが必要なものであるかどうかはわかりません。これまでのところ、これらは私が持っているクラスです:

SessionManager:

public static class SessionManager : ISessionManager
{
    public static void RegisterSession(string key, object obj)
    {
        System.Web.HttpContext.Current.Session[key] = obj;
    }

    public static void FreeSession(string key)
    {
        System.Web.HttpContext.Current.Session[key] = null;
    }


    public static bool CheckSession(string key)
    {
        if (System.Web.HttpContext.Current.Session[key] != null)
            return true;
        else
            return false;
    }


    public static object ReturnSessionObject(string key)
    {
        if (CheckSession(key))
            return System.Web.HttpContext.Current.Session[key];
        else
            return null;
    }
}

SharweAuthorizeAttribute:それが実際にやるべきことかどうかはわかりません

public class SharweAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        if (SessionManager.CheckSession(SessionKeys.User) == true)
            return true;
        else 
            return false;
    }
}

今ここに私が必要なものがあります:

  1. そもそも私のSharweAuthorizeAttributeクラスは正しいですか?
  2. 認証されていないユーザーをログインページにリダイレクトできるようにする必要があります
  3. (自分のロールプロバイダーを使用して)ロールに基づいてユーザーを承認する必要があるので、次のようにします。

    [SharweAuthorize(Roles="MyRole")]
    

それだと思います...どんな提案でも大歓迎です:)

UPDATE:Okもう一度そのページを読んだところ、質問2の解決策が見つかりました。

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
    if (SessionManager.CheckSession(SessionKeys.User) == false)
    {
        filterContext.Result = new RedirectToRouteResult(
                        new RouteValueDictionary 
                        {
                            { "action", "ActionName" },
                            { "controller", "ControllerName" }
                        });
    }
    else
        base.HandleUnauthorizedRequest(filterContext);
}

よろしければ教えてください...

40
Kassem

はい、あなたはそれを正しく理解しました(IMOはカスタムメンバーシッププロバイダーを実装する方がより安全で簡単ですが、それはあなたの選択です)

  1. はい、それは正しいです
  2. あなたはそれを正しく行います
  3. rolesプロパティをAuthorizeAttribute基本クラスから継承し、実装に、ユーザーがロールに属しているかどうかをチェックインします。

編集:役割についてもう少し

あなたが持っている場合

[SharweAuthorize(Roles="MyRole")]

次に、AuthorizeCoreメソッドのRolesプロパティを確認できます。

protected override bool AuthorizeCore(HttpContextBase httpContext)
{
    if (SessionManager.CheckSession(SessionKeys.User) == true) {
        if (SessionManager.CheckUserIsInRole( Roles )) // where Roles == "MyRole"
           return true;
    }
    return false;
}
21
Eduardo Molteni