将安全问题转移到数据访问层

时间:2013-05-31 09:25:52

标签: c# asp.net-mvc asp.net-mvc-4

我正在将所有身份验证和安全问题转移到ASP.NET MVC4 Internet应用程序上的数据访问层中。登录,注销,创建用户等一切都很好,但我在向用户添加角色方面遇到了绊脚石。

创建用户帐户后,我想将它们添加到某些默认角色。这样做的方法如下所示

public static string CreateUserAccount(string username, string password)
{
    WebSecurity.CreateUserAndAccount(username, password);
    var roleProvider = new SimpleRoleProvider();
    roleProvider.AddUsersToRoles(new[] {username}, new[] {"MeterInfo", "SiteInfo", "AMRInfo", "InstallImages"});
    return username + " Account Created";
}

调用WebSecurity来创建帐户是可以的,但我使用SimpleRoleProvider会导致此错误

  

在调用“WebSecurity”类的任何其他方法之前,必须调用“WebSecurity.InitializeDatabaseConnection”方法。此调用应放在站点根目录中的_AppStart.cshtml文件中。

InitializeDatabaseConnection已在AuthConfig中处理,并在global.asax启动时调用。

AssetRegisterDataLayer.DataAccess.Security.InitializeSecurity();

在我的DataAccess层上调用的方法如下所示

public static void InitializeSecurity()
{
    WebSecurity.InitializeDatabaseConnection("AssetRegisterDb","UserProfile","UserId","UserName", false);   
}

我已经看到当人们使用开箱即用的配置进行MVC4时会发生此问题,其中Accounts控制器使用[InitializeSimpleMembership]属性进行修饰,而不是在应用程序启动时调用WebSecurity初始化程序,但事实并非如此这里。任何人都知道除了角色之外所有WebSecurity的工作原理?

非常感谢

1 个答案:

答案 0 :(得分:1)

我发现了自己的错误,如果其他人有类似的问题,我会回答我自己的问题。

我的问题中显示的代码中的错误是实例化一个新的SimpleRoleProvider。我应该这样做

public static string CreateUserAccount(string username, string password)
{
    WebSecurity.CreateUserAndAccount(username, password);
    var roleProvider = (SimpleRoleProvider)Roles.Provider;
    roleProvider.AddUsersToRoles(new[] {username}, new[] {"MeterInfo", "SiteInfo", "AMRInfo", "InstallImages"});
    return username + " Account Created";
}