【发布时间】:2011-06-20 06:45:24
【问题描述】:
这主要是一个理论问题,例如,如果我想创建自己的表单身份验证替代方案。
【问题讨论】:
-
我认为表单身份验证很容易扩展以满足最奢侈的需求。为什么要使用自定义模块?
标签: asp.net
这主要是一个理论问题,例如,如果我想创建自己的表单身份验证替代方案。
【问题讨论】:
标签: asp.net
Page.User 只返回Page.Context.User,它应该通过模块或global.asax 在HttpApplication.AuthenticateRequest 的处理程序中设置。您可以提供IPrincipal 的自定义实现,然后可以返回IIdentity 的自定义实现。
例如:
public class App : HttpApplication
{
public App()
{
AuthenticateRequest += App_AuthenticateRequest;
}
void App_AuthenticateRequest(object sender, EventArgs e)
{
var cookie = Request.Cookies[FormsAuthentication.FormsCookieName];
if (cookie == null) return;
var userData = GetUserData(cookie.Value);
var userIdentity = new MyIdentity(userData);
Context.User = new MyPrincipal(userIdentity);
}
private string GetUserData(string value)
{
try
{
var ticket = FormsAuthentication.Decrypt(value);
return ticket == null ? null : ticket.UserData;
}
catch (ArgumentException)
{
Response.Cookies.Remove(FormsAuthentication.FormsCookieName);
return null;
}
}
}
【讨论】:
您需要编写自己的身份验证模块 - 请参阅此 excellent article,它解释了如何编写支持基本和摘要身份验证的 ASP.NET 身份验证模块。
如果您只考虑表单身份验证方案,那么您真的不必编写一个。内置的 Forms Authenticate 模块非常可扩展(并提供了很大的灵活性)。
【讨论】:
经过一番谷歌搜索,我找到了this blogpost。它很好地描述了如何做到这一点。基本上你需要创建一个自定义的HTTP模块并处理HttpApplication对象的OnAuthenticateRequest事件。
【讨论】: