在调用"WebSecurity"类的任何其他方法之前,必须调用"WebSecurity.InitializeDatabaseConnection"方法

Ale*_*sky 25 asp.net asp.net-mvc-4

除了在AccountController.cs文件中生成的内容之外,我无法使WebSecurity对象在任何地方工作.帐户控制器的[InitializeSimpleMembership]属性设置在顶部.例如,登录功能不会抱怨打电话WebSecurity.Login(...).我向AccountController添加了一个子动作:

[ChildActionOnly]
        [AllowAnonymous]
        public ActionResult NavBar()
        {
            NavBarViewModel viewModel = new NavBarViewModel();
            viewModel.LinkItems = new List<NavBarLinkItem>();

            if (Request.IsAuthenticated)
            {
                SimpleRoleProvider roleProvider = new SimpleRoleProvider();
                if (roleProvider.IsUserInRole(User.Identity.Name, "User"))
                {
                    viewModel.LinkItems.Add(new NavBarLinkItem() 
                    { Title = "Create Project", Action = "Create", Controller = "Project" });

                }

            }

            viewModel.LinkItems.Add(new NavBarLinkItem() { Title="Help", Action="Index", Controller="Help" });

            return PartialView("_NavBar", viewModel);
        }
Run Code Online (Sandbox Code Playgroud)

保持原样,代码崩溃"if(roleProvider.IsUserInRole(User.Identity.Name,"User"))""行与主题错误消息.所以我进入InitialzeSimpleMembershipAttribute.cs文件并在我的函数顶部复制/粘贴这一行:

WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
Run Code Online (Sandbox Code Playgroud)

...并获取一条错误消息,即只应调用一次WebSecurity.InitializeDatabaseConnection.这是有道理的,因为在控制器定义的顶部有一个属性应该已经调用了这个函数(并且看起来它确实很好).所以为了安全起见,我将以上电话改为:

if (!WebSecurity.Initialized)
            {
                WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId",
                                                         "UserName", autoCreateTables: true);
            }
Run Code Online (Sandbox Code Playgroud)

...并获取原始错误消息,应该在blah blah blah之前调用WebSecurity.InitializeDatabaseConnection.任何对这种疯狂的见解都将不胜感激

Nei*_*ett 49

这里有一个更好的解释:http: //odetocode.com/blogs/scott/archive/2012/09/24/perils-of-the-mvc4-accountcontroller.aspx

这就是你所要做的一切:

  1. [InitializeSimpleMembership]从顶部删除AccountController
  2. WebSecurity.InitializeDatabaseConnection(...)调用从/Filters/InitializeSimpleMembershipAttribute.cs(第39行)复制到/AppStart/AuthConfig.cs
  3. 随意从项目中删除InitializeSimpleMembershipAttribute.cs

你不具备的添加InitializeDatabaseConnection()调用AuthConfig.RegisterAuth()但它似乎是逻辑的地方,让您的Global.asax清洁.

您实际上正在做的是从原始属性中提取初始化调用并在Application_Start上显式调用它.如果您不使用(或不需要)SimpleMembership,属性中的其他所有内容都只是有条件的检查.


roa*_*own 9

将[InitializeSimpleMembership](如在AccountController中提到的那样)添加到我需要访问WebSecurity的控制器顶部,这对我来说很有用.但是不确定它是否是预期的实现方法...

[InitializeSimpleMembership]
public class DataController : Controller
{ ... }
Run Code Online (Sandbox Code Playgroud)


Ale*_*sky 5

我在interwebs上找到了这个:http://forums.asp.net/t/1718361.aspx/1 基本上,不要使用SimpleRoleProvider类型.有一个Roles对象可以允许这样的简单调用:

if (Request.IsAuthenticated)
{
  if( Roles.IsUserInRole(User.Identity.Name, "User"))
  {
    viewModel.LinkItems.Add(new NavBarLinkItem() 
    { Title = "Create Project", Action = "Create", Controller = "Campaign" });
  }
}
Run Code Online (Sandbox Code Playgroud)