我的应用程序在一个域下有多个模块。 https://SomeDomain.es/
假设我有模块module1和module2,我可以访问模块as https://SomeDomain.es/module1
当我尝试访问上面的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)
{
}
}
这也是超时的情况。
答案 0 :(得分:0)
当我使用表单身份验证时,我使用以下方法设置身份验证cookie:
FormsAuthentication.SetAuthCookie