2013-08-28 18 views
2

我用簡單的會員資格,因爲你在web.config中知道你可以指定登錄網址,如下所示認證形式登錄我mvc4 asp.net項目的URL和路由數據

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

我的問題是這樣的,在項目的網址我有一個路線數據,以確定文化信息

樣品網址:http://somedomain.com/en-us/controller/action

假設有人試圖達到的成員只有他們將被重定向在web.config中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

如何實現這一目標?

回答

2

其實我想我已經找到了答案!

唯一想我需要的是一個自定義屬性從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))); 
    } 
} 
1

不幸的是,您不能簡單地在loginUrl中設置一個值,該值將更改爲當前文化。

我有一個網站,我在網址中有文化並指定loginUrl

我所做的是在每個請求中,我確保文化在URL中指定,如果不是,我只需通過將文化前置到當前請求的URL來重定向用戶。

因此,/ EN-US /控制器/ memberonly - > /帳號/登錄 - >/EN-US /帳號/登錄

2

我有你同樣的問題,你指出我在正確的方向。 我創建的文件夾的過濾器一類與此代碼

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

它的工作就像一個魅力! 謝謝!

+0

是不是我自己的答案?!! –

+0

嗨亞歷杭德羅。可以編輯你的答案,以清楚你的代碼與@ user2675751的答案中的代碼的區別。謝謝! –

+1

Milad答案中的代碼不能編譯,因爲它缺少實際的方法定義。相反,邏輯直接在課堂上。 另外我喜歡Alejandro如何顯示如何使用屬性。 – mono68

1

非常感謝前面的例子,它對我有很大的幫助。我想和大家分享你的答案rewriten爲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 

稍微注意一下,如果你想影響所有controlers,你應該把這個在FilterConfig.vb

Public Shared Sub RegisterGlobalFilters(ByVal filters As GlobalFilterCollection) 
    filters.Add(New HandleErrorAttribute()) 
    filters.Add(New cAuthorizeAttribute()) 
End Sub