2

私のmvc4 asp.netプロジェクトでは、単純なメンバーシップを使用しました.web.configで知っているように、以下のようにログインURLを指定できます

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

私の問題はこれです。プロジェクトのURLには、文化情報を決定するためのルートデータがあります

サンプル URL : 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

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 に答える