是否有人在控制器上成功同时使用Authorize和RequireSSL(来自MVC期货)属性?我已经创建了一个控制器,我必须强制执行用户必须登录并使用安全连接才能执行的规则。如果用户没有安全连接,我希望应用程序重定向到https,因此我在RequireSSL属性上使用Redirect = true。代码看起来像(CheckPasswordExpired是我自己开发的属性):
[Authorize]
[RequireSsl(Redirect = true)]
[CheckPasswordExpired(ActionName = "ChangePassword",
ControllerName = "Account")]
[HandleError]
public class ActionsController : Controller
{
....
}
mysite.com/Actions/Index是网站的默认路由,也是重定向到表单身份验证的默认页面。
当我浏览到http://mysite.com时,我想要获得的是用户重定向到安全连接,并且因为它们尚未经过身份验证,还要登录到登录页面。我得到的是HTTP 400错误(错误请求)。如果我导航到http://mysite.com/Account/Login,重定向可以正常工作,但我的帐户控制器和登录操作方法都没有[授权]属性。
任何人都有使用这两个属性来实现我的目标的经验吗?
谢谢!
答案 0 :(得分:4)
我正在使用它们并取得成功。你有默认行动的属性吗?
public class HomeController : BaseController
{
[Authorize]
[RequireSsl]
public ActionResult Index ()
{
}
}
BTW我使用的是比期货略有修改的版本,以便我可以全局禁用SSL:
[AttributeUsage (AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public sealed class RequireSslAttribute : FilterAttribute, IAuthorizationFilter
{
public RequireSslAttribute ()
{
Redirect = true;
}
public bool Redirect { get; set; }
public void OnAuthorization (AuthorizationContext filterContext)
{
Validate.IsNotNull (filterContext, "filterContext");
if (!Enable)
{
return;
}
if (!filterContext.HttpContext.Request.IsSecureConnection)
{
// request is not SSL-protected, so throw or redirect
if (Redirect)
{
// form new URL
UriBuilder builder = new UriBuilder
{
Scheme = "https",
Host = filterContext.HttpContext.Request.Url.Host,
// use the RawUrl since it works with URL Rewriting
Path = filterContext.HttpContext.Request.RawUrl
};
filterContext.Result = new RedirectResult (builder.ToString ());
}
else
{
throw new HttpException ((int)HttpStatusCode.Forbidden, "Access forbidden. The requested resource requires an SSL connection.");
}
}
}
public static bool Enable { get; set; }
}