[在过去的几天中,我一直在为webApp(asp.Net MVC 5)创建一个登录系统,其中已经有一个包含用户名,凭据和角色的数据库。我从许多博客中找到了信息,并为我的工作提出了堆栈溢出问题,并相应地使用了它。现在,在上线之前,我要确保此登录系统是安全的。我也想知道是否可以为此目的实现一些改进。
对于身份验证,我已经实现了以下文章https://www.jamessturtevant.com/posts/ASPNET-Identity-Custom-Database-and-OWIN/中所示的方法。对于授权,我使用了角色提供程序并实现了一些必需的方法,如下所示:
public class RoleList:RoleProvider
{
public override bool IsUserInRole(string username, string roleName)
{
if (username == null || username == "")
throw new ProviderException("User name cannot be empty or null.");
if (roleName == null || roleName == "")
throw new ProviderException("Role name cannot be empty or null.");
bool userIsInRole = false;
List<string> data = new List<string>();
String mycon = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;
String myquery =
"SELECT " +
"r.RName, u.UName " +
"FROM " +
"Users u " +
"INNER JOIN " +
"UserRole ur " +
"ON " +
"u.Id=ur.UserId " +
"INNER JOIN " +
"Roles r " +
"ON " +
"ur.RoleId=r.Id " +
"WHERE " +
"u.UName=@UName " +
"AND " +
"r.Name=@RName";
var paramList = new List<SqlParameter>();
paramList.Add(new SqlParameter("@UName", username));
paramList.Add(new SqlParameter("@RName", roleName));
using (var reader = HelperClasses.DatabaseUtil.GetReader(myquery, mycon, paramList))
{
if (reader.HasRows)
{
userIsInRole = true;
}
}
return userIsInRole;
}
}
在数据库中在数据库中,我有4个表,分别存储以下信息。
在登录控制器中
登录:
CustomSignInManager.SignIn(user, isPersistent: false, rememberBrowser: false);
注销:
public ActionResult LogOff()
{
HttpContext.GetOwinContext().Authentication.SignOut
(DefaultAuthenticationTypes.ApplicationCookie);
return RedirectToAction("Index","Login");
}
[授权动作
[Authorize(Roles = "Customer")]
public ActionResult Index()
{
return View();
}
因为,它是应用程序中的一个重要部分,我希望了解它的优缺点。我尽可能简化了问题,以使读者易于理解。这是ASP.NET MVC 5中登录系统的正确方法吗?我可以做得更好吗?
不是