如果未经过身份验证,则重定向到登录?

时间:2015-07-13 22:30:11

标签: c# asp.net-mvc asp.net-mvc-4 iis

我的应用程序在一个域下有多个模块。 https://SomeDomain.es/

假设我有模块module1和module2,我可以访问模块as https://SomeDomain.es/module1

https://SomeDomain.es/module2

当我尝试访问上面的url时,如果没有经过身份验证,它会将我重定向到登录页面。如果我尝试访问module1中的页面,那么它不会重定向到登录页面。而是尝试通过初始化控制器来提供响应。控制器有一个构造函数,它需要ICustomPrincipal作为参数,并使用 Unity IOC 注入。解析ICustomPrincipal时失败,因为Identity为null。

https://SomeDomain.es/module1(重定向到登录)

https://SomeDomain.es/module1/Profile/2(不会重定向到登录)

Web.Config中:

 <authentication mode="Forms">
   <forms name=".SomeLoginCookie" loginUrl="~/Account/Login" timeout="2880" protection="All" enableCrossAppRedirects="true" />
 </authentication>

我使用在控制器上标记的自定义授权属性

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    public ICustomPrincipal customPrincipal;

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        bool authorize = false;
        authorize = base.AuthorizeCore(httpContext);

        if(!authorize)
            return false;

        if(!httpContext.Request.IsAuthenticated)
            return false;

        if(customPrincipal== null)
        {
            var factory = new PrincipalFactory(httpContext.User);
            customPrincipal= factory.CreatePrincipal();
        }

        if(customPrincipal.HasPermissions(function))
            authorize = true;
        else
            authorize = false;

        return authorize;
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if(filterContext.HttpContext.Request != null && filterContext.HttpContext.Request.IsAuthenticated)
        {
            filterContext.Result = new ViewResult() { ViewName = "AccessDenied" };
                //new HttpStatusCodeResult(403);
        }
        else
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }

我使用 [授权] 属性进行了测试,而不是自定义属性,但没有成功。

我不确定这里的问题是什么。请分享您的想法。

控制器:

[NoCache]
[CustomAuthorize(CustomFunction.Profile)]
public partial class ProfileController : Controller
{
    public ICustomPrincipal Principal {get; set;}

    public ProfileController(ICustomPrincipal principal)
    {
        Principal = principal;
    }

    public ActionResult Index(int Id)
    {
    }
}

这也是超时的情况。

1 个答案:

答案 0 :(得分:0)

当我使用表单身份验证时,我使用以下方法设置身份验证cookie:

FormsAuthentication.SetAuthCookie