我有一个移动布局区域。然后,我的路线中也有控制器,只使用正常的网站布局。
问题是当我使用[Authorize(Roles =“ROLENAME”)]且用户不在角色时,页面(移动网站)被重定向到普通网站登录页面,而不是移动网站。
是否可以根据用户尝试访问网站的区域在登录之间切换?
我尝试在我的区域web.config中添加以下内容,但它不起作用:
<authentication mode="Forms">
<forms loginUrl="~/Activation/Login/Index" timeout="2880" />
</authentication>
有什么建议吗?
答案 0 :(得分: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" } });
}
}
}
此过滤器将检查其移动设备(而不是移动区域),并将其发送到移动区域中的相同操作和控制器。 注意 如果您使用同名控制器,则必须使用控制器名称空间see this answer
注册路由然后你可以将过滤器应用于每个动作,如:
[RedirectToMobileArea]
public ActionResult Index()
{
// do stuff.
}
或者,如果你想这样做,无论如何都要创建一个所有控制器都继承的BaseController并将其应用于:
[RedirectToMobileArea]
public abstract class BaseController : Controller {
}
然后继承它:
public HomeController : BaseController {
}
我没有测试任何这个,但它应该有用......