asp.net-mvc - 不同区域的登录屏幕不同 - MVC3

标签 asp.net-mvc asp.net-mvc-3 asp.net-membership

我有一个移动布局的区域。然后,我的 route 也有仅使用正常网站布局的 Controller 。

问题是,当我使用 [Authorize(Roles = "ROLENAME")] 并且用户不具有角色时,页面(移动网站)会重定向到正常的网站登录页面,而不是移动页面。

是否可以根据用户尝试访问网站的区域在登录之间切换?

我尝试在我的区域 web.config 中添加以下内容,但没有成功:

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

有什么建议吗?

最佳答案

当您登录操作被点击时,检查它们是否在移动设备上,如果是,则重定向到移动登录页面。

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" } });
        }
    }
}

此过滤器将采取任何操作检查其是否移动(并且不在移动区域中)并将其发送到移动区域中的相同操作和 Controller 。 注意如果您使用同名的 Controller ,则必须使用 Controller 命名空间 see this answer 注册您的路由。

然后您可以将过滤器应用于每个操作,例如:

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

或者,如果您想在任何地方执行此操作,请创建一个 BaseController,您的所有 Controller 都继承该 BaseController 并将其应用到该 BaseController:

[RedirectToMobileArea]
public abstract class BaseController : Controller {

}

然后继承它:

public HomeController : BaseController {

}

我还没有测试过这些,但它应该可以工作......

关于asp.net-mvc - 不同区域的登录屏幕不同 - MVC3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16517596/

相关文章:

javascript - 将 javascript 变量转换为 C# 变量

c# - 是否有类似于 OutputCache 的属性,我可以在普通 C# 方法上使用?

asp.net-mvc - 测试自定义 ActionResult

使用浏览器后退按钮进行 ASP.NET 身份验证登录和注销

javascript - 这是让 ASP.NET MVC 和 javascript intellisense 发挥良好作用的 "correct"解决方案吗?

javascript - 让 Jquery 代码变得通用?

.net - 无法获取 C# .net 下拉列表的 linq 字符串和 int concat

c# - ActiveRecord 与 mvc3

asp.net-mvc-3 - ASP.NET MVC3 : Do I need to use a MembershipProvider?

asp.net - 将 Facebook 身份验证与现有的 ASP.NET 成员资格集成