C# 身份验证表单登录url和路由数据

C# 身份验证表单登录url和路由数据,c#,asp.net,asp.net-mvc-4,asp.net-membership,C#,Asp.net,Asp.net Mvc 4,Asp.net Membership,在我的mvc4 asp.net项目中,我使用了简单的成员身份,正如您在web.config中所知道的那样,您可以指定如下所示的登录url <authentication mode="Forms"> <forms loginUrl="~/account/login" timeout="2880" /> </authentication> 假设有人尝试访问仅限成员的操作,他们将被重定向到web.config中指定的url,我只想知道是否有方法根据语言路由

在我的mvc4 asp.net项目中,我使用了简单的成员身份,正如您在web.config中所知道的那样,您可以指定如下所示的登录url

<authentication mode="Forms">
  <forms loginUrl="~/account/login" timeout="2880"  />
</authentication>

假设有人尝试访问仅限成员的操作,他们将被重定向到web.config中指定的url,我只想知道是否有方法根据语言路由值更改该url

示例>>重定向到>>

示例>>重定向到>>


如何做到这一点

不幸的是,您不能简单地在
loginUrl
中设置将更改为当前区域性的值

我有一个网站,在那里我在URL中有文化,并指定
loginUrl

我要做的是,在每个请求中,我确保URL中指定了区域性,如果没有指定,我只需通过将区域性前置到当前请求的URL来重定向用户


因此,/en-us/controller/memberonly->/account/login->/en-us/account/login

事实上,我想我已经找到了答案

我唯一需要的是从
AuthorizeAttribute
继承的自定义属性,并重写
HandleUnauthorizedRequest
方法

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
internal sealed class LocalizedAuthorizeAttribute : AuthorizeAttribute
{
        string language = filterContext.RouteData.Values["lang"] == null ? "en-us" : filterContext.RouteData.Values["lang"].ToString();
        filterContext.Result = 
            new RedirectResult
                (string.Format("~/{0}/account/login?returnUrl={1}",
                                language,
                                HttpUtility.UrlEncode(filterContext.HttpContext.Request.Url.PathAndQuery)));
    }
}

我和你有同样的问题,你给我指出了正确的方向。 我在filters文件夹中用以下代码创建了一个类

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
internal sealed class LocalizedAuthorizeAttribute : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        string language = filterContext.RouteData.Values["lang"] == null ? "en-us" : filterContext.RouteData.Values["lang"].ToString();
        filterContext.Result = 
        new RedirectResult
            (string.Format("~/{0}/account/login?returnUrl={1}",
                            language,
                            HttpUtility.UrlEncode(filterContext.HttpContext.Request.Url.PathAndQuery)));
         //base.HandleUnauthorizedRequest(filterContext);
    }


}
然后从我的控制器我这样叫它:

 [LocalizedAuthorize]
    public ActionResult Create()
    {
        return View();
    }
它就像一个符咒!
谢谢

非常感谢前面的例子,它对我帮助很大。我只想分享你的答案重写为vb.net

<AttributeUsage(AttributeTargets.Class Or AttributeTargets.Method, Inherited:=True, AllowMultiple:=True)>
Class cAuthorizeAttribute

    Inherits AuthorizeAttribute

    Protected Overrides Sub HandleUnauthorizedRequest(filterContext As AuthorizationContext)
        Dim strLanguage As String = filterContext.RouteData.Values("lang")
        If Not strLanguage Is Nothing Then
            filterContext.Result = New RedirectResult(String.Format("~/{0}/Account/Login?returnUrl={1}", strLanguage, HttpUtility.UrlEncode(filterContext.HttpContext.Request.Url.PathAndQuery)))
        Else
            MyBase.HandleUnauthorizedRequest(filterContext)
        End If
    End Sub
End Class

这不是我自己的答案吗?!!嗨,亚历杭德罗。可以编辑您的答案,以明确您的代码与@user2675751答案中的代码有何不同。谢谢Mild答案中的代码没有编译,因为它缺少实际的方法定义。相反,逻辑直接在类中。我还喜欢Alejandro展示如何使用属性的方式。我认为最好的方法是编辑@MiladHosseinpanahi答案,而不是创建一个新答案并添加一些部分。无论如何,感谢您提供的实用解决方案。感谢您提供的主要和纯解决方案:)
Public Shared Sub RegisterGlobalFilters(ByVal filters As GlobalFilterCollection)
    filters.Add(New HandleErrorAttribute())
    filters.Add(New cAuthorizeAttribute())
End Sub