我正在创建一个新的 ASP.NET MVC 4 应用程序(实际上是我的第一个 MVC 应用程序),它是我以前的 ASP.NET Web 表单应用程序的一部分。我从未在我的任何项目中使用过 ASP.NET 内置身份验证方法。这个新的 MVC 4 应用程序将发布在以前应用程序的子域上。登录将从以前的应用程序完成。如果未登录,应从 MVC 应用程序提供返回 url 以返回到当前页面。但是,新用户注册、帐户恢复选项已经在以前的 Web 表单应用程序中开发,我不想在我的新 MVC 中复制它们应用。
token
登录成功后,Web 表单应用程序将发出一个带有令牌编号的 cookie ,该 cookie 将共享给所有域,例如*.maindomain.com
.
现在我想将我自己的令牌验证方法与 ASP.NET 内置方法合并,以便我可以Authorize
在我的新 MVC 应用程序中使用其他与安全相关的选项。
在我之前的应用程序中,我以下列方式开发了我的自定义用户验证系统。
首先,我有以下相关的 SQL Server 表
和以下课程
public class Token
{
public static uint GenerateToken(string userEmail, string password, bool isPersistent)
{
// this static function generates a uint type unique token number
// and put this in the cookie "token" using HttpContext.Current.Response object.
// if isPersistent is set to true then cookie will be persistent otherwise not
// if there is any problem in creating token then it will throw an Exception with proper message
// Possible causes of not generating a token are
// 1. Invalid useremail or password
// 2. 'State' value in 'Member' table is 'EmailPending' or 'Suspended' (there is an enum for MemberState
}
public Token(uint tokenNo, bool validateImmediately = false)
{
// simply load token details with a few filed from member table from database
// Call validate function if validateImmediately is set to true
// Throws an exception if token does not exists in the database
}
public void Validate()
{
// Checks for everything like MemberState is Active and Token status is also Active and throws exception if anything wrong
// and then check (LastAccessedOn.AddSeconds(TokenLife) < AppSettings.Now) is not true
// Call UpdateStatus function with new token status and current page from HttpContext in comment parameter
}
public void UpdateStatus((TokenStatus newStatus, string comment = "")
{
// simply write both newStatus and Comment in Token table
// and remove the token cookie if newStatus is not set to Active
}
public uint TokenNumber { get; private set; }
public uint MemberNumber { get; private set; } // from Member table
public string Name { get; private set; } // from Member table
public MemberState MemberState { get; private set; } // from Member table
public string MemberEmail { get; private set; } // from member table
public uint BusinsessNo { get; private set; } // from Business table
public DateTime CreatedOn { get; private set; }
public DateTime LastAccessedOn { get; private set; }
public uint TokenLife { get; private set; } // from member
public string CreatedIP { get; private set; }
public string LastIP { get; private set; }
public bool IsPersistent { get; private set; }
public TokenStatus Status { get; private set; }
public string Comment { get; private set; }
public static Token Current
{
get
{
if (_t == null)
_t = new Token(uint.Parse(HttpContext.Current.Request.Cookies["token"].Value));
return _t;
}
}
private static Token _t;
}
public class Member
{
// all member related operations like new member, send verification email and verify email
}
对于注销用户,我只需调用 UpdateStatus 之类的(TokenSatus.Closed, "User logged out")
。此方法将负责删除 cookie。
注意:成员类有一个属性bool IsAdmin
。你知道它为什么。
请根据我在 MVC 应用程序中的需要建议我开发身份验证系统的最佳解决方案。我再次告诉您,类似New User
,Account Recovery
的选项Email Verification
将在我之前的 ASP.NET Web 表单应用程序中完成。我只需要将我Validate()
的类方法Token
放在 MVC 应用程序中的正确位置即可。我真的对互联网上提供的几种解决方案感到困惑。