我有一个移动布局的区域。然后,我的 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/