我正在尝试根据现有的 cookie 对用户进行身份验证。我过去通过使用自定义IIdentity
和IPrincipal
public class CustomIdentity : IIdentity {
public string Name { get; set; }
public bool IsAuthenticated { get { return true; } }
public string AuthenticationType { get { return String.Empty; } }
}
public class CustomPrincipal : IPrincipal {
private CustomIdentity _identity;
private string[] _roles;
public IIdentity Identity {
get { return _identity; }
}
public CustomPrincipal(CustomIdentity identity, string[] roles) {
_identity = identity;
_roles = roles;
}
public bool IsInRole(string role) {
return true;
//TODO
}
}
我设置了一个简单的 HttpModule 来处理身份验证。
public class Authentication : IHttpModule {
public void Init(HttpApplication application) {
application.AuthenticateRequest += new EventHandler(Application_AuthenticateRequest);
}
private void Application_AuthenticateRequest(object sender, EventArgs e) {
//TODO: authentication logic here
CustomIdentity identity = new CustomIdentity();
CustomPrincipal principal = new CustomPrincipal(identity, new string[] { });
HttpContext.Current.User = principal;
}
public void Dispose() { }
}
当我通过 web.config 禁止匿名用户时,框架会无限重定向到 login.aspx,即使HttpContext.Current.Request.IsAuthenticated
在身份验证事件之后是真的。
这发生在身份验证模式 Windows、Forms 和 None 上。
如何使框架相信请求已正确验证?
更新:
事实证明,其他地方还有其他代码正在调用System.Web.Security.FormsAuthentication.SignOut()
,因此我的身份验证模块正在设置主体,调用了注销并且模块将再次触发。因此无休止的重定向循环。