C# 身份验证表单登录url和路由数据
在我的mvc4 asp.net项目中,我使用了简单的成员身份,正如您在web.config中所知道的那样,您可以指定如下所示的登录urlC# 身份验证表单登录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,我只想知道是否有方法根据语言路由
<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