2

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

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

我的问题是,在项目网址中,我有一个路线数据来确定文化信息

示例网址:http ://somedomain.com/en-us/controller/action

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

示例 > http://somedomain.com/en-us/controller/membersonly > 重定向到 >> http://somedomain.com/en-us/account/login

示例 > http://somedomain.com/ku-ir/controller/membersonly > 重定向到 >> http://somedomain.com/ku-ir/account/login

如何做到这一点?

4

4 回答 4

4

我遇到了同样的问题,您为我指出了正确的方向。我使用此代码在过滤器文件夹中创建了一个类

[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();
    }

它就像一个魅力!谢谢!

于 2013-08-30T15:55:01.250 回答
3

其实我想我找到了答案!

我唯一需要的是继承自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)));
    }
}
于 2013-08-29T12:03:17.657 回答
1

不幸的是,您不能简单地设置一个loginUrl将更改为当前文化的值。

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

我所做的是,在每个请求中,我确保在 URL 中指定了文化,如果不是,我只需通过将文化附加到当前请求的 URL 来重定向用户。

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

于 2013-08-28T19:12:38.873 回答
1

非常感谢前面的例子,它对我帮助很大。我只想分享您为 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

小注意,如果你想影响你所有的控制器,你应该把它放在 FilterConfig.vb

Public Shared Sub RegisterGlobalFilters(ByVal filters As GlobalFilterCollection)
    filters.Add(New HandleErrorAttribute())
    filters.Add(New cAuthorizeAttribute())
End Sub
于 2013-09-24T15:50:51.637 回答