2

モバイルレイアウトのエリアがあります。次に、通常の Web サイト レイアウトを使用するコントローラーもルートに配置します。

問題は、[Authorize(Roles = "ROLENAME")] を使用し、ユーザーが役割を果たしていない場合に、ページ (モバイル サイト) がモバイルではなく通常の Web サイトのログイン ページにリダイレクトされることです。

ユーザーがサイトにアクセスしようとしているエリアに応じて、ログインを切り替えることは可能ですか?

私は自分のエリア web.config に以下を追加しようとしましたが、うまくいきませんでした:

<authentication mode="Forms">
      <forms loginUrl="~/Activation/Login/Index" timeout="2880" />
</authentication>

助言がありますか?

4

1 に答える 1

2

ログイン時にアクションがヒットしたら、モバイル デバイス上にあるかどうかを確認し、モバイル デバイス上にある場合はモバイル ログイン ページにリダイレクトします。

private static string[] mobileDevices = new string[] {"iphone","ppc",
                                                      "windows ce","blackberry",
                                                      "opera mini","mobile","palm",
                                                      "portable","opera mobi" };

public static bool IsMobileDevice(string userAgent)  
{  
    // TODO: null check
    userAgent = userAgent.ToLower();  
    return mobileDevices.Any(x => userAgent.Contains(x));
}

次に、アクションで:

public ActionResult Index()
{
    if (MobileHelper.IsMobileDevice(Request.UserAgent))
    {
        // Send to mobile route.
         return RedirectToAction("Login", "MobileActivation");
    }

    // Otherwise do normal login
}

編集:

これをアプリケーション全体に広く適用したい場合は、次のようにすることができます。

次のように、どこにでも適用できる ActionFilter を作成します。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class RedirectToMobileArea : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var rd = filterContext.HttpContext.Request.RequestContext.RouteData;
        var currentAction = rd.GetRequiredString("action");
        var currentController = rd.GetRequiredString("controller");
        string currentArea = rd.Values["area"] as string;

        if (!currentArea.Equals("mobile", StringComparison.OrdinalIgnoreCase) && MobileHelper.IsMobileDevice(Request.UserAgent))
        {
            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary { { "controller", currentController }, { "action", currentAction }, { "area", "mobile" } });
        }
    }
}

このフィルターは、モバイル (モバイル エリアにまだない) かどうかをチェックし、モバイル エリアの同じアクションとコントローラーに送信します。同じ名前のコントローラーを使用する場合は、ルートをコントローラーの名前空間に登録する必要がありますこの回答を参照してください

次に、次のような各アクションにフィルターを適用できます。

[RedirectToMobileArea]
public ActionResult Index()
{
// do stuff.
}

または、どこでも実行したい場合は、すべてのコントローラーが継承する BaseController を作成し、それに適用します。

[RedirectToMobileArea]
public abstract class BaseController : Controller {

}

次に、それから継承します。

public HomeController : BaseController {

}

私はこれをテストしていませんが、うまくいくはずです...

于 2013-06-15T19:23:30.103 に答える