Asp.net 你必须称之为;WebSecurity.InitializeDatabaseConnection“;方法,然后再调用;“网络安全”;班

Asp.net 你必须称之为;WebSecurity.InitializeDatabaseConnection“;方法,然后再调用;“网络安全”;班,asp.net,asp.net-mvc-4,Asp.net,Asp.net Mvc 4,除了AccountController.cs文件中已经生成的内容外,我无法使WebSecurity对象在任何地方工作。帐户控制器在顶部设置了[InitializeSimpleMembership]属性。例如,登录函数不会抱怨调用WebSecurity.Login(…)。我向AccountController添加了一个子操作: [ChildActionOnly] [AllowAnonymous] public ActionResult NavBar()

除了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);
        }
。。。并获取一条错误消息,即WebSecurity.InitializeDatabaseConnection只应调用一次。这是有意义的,因为在控制器定义的顶部有一个属性,它应该已经调用了这个函数(看起来它做得很好)。为了安全起见,我将上述通话改为:

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

。。。并返回原始错误消息,即WebSecurity.InitializeDatabaseConnection应在诸如此类之前调用。任何对这种疯狂行为的洞察都将不胜感激

我在互联网上发现了以下内容: 基本上,不要使用SimpleRoleProvider类型。有一个Roles对象允许进行如下简单调用:

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

将[InitializeSimpleMembership](在AccountController中提到并找到)添加到访问Web安全性所需的控制器的顶部为我实现了这一技巧。但是不确定它是否是预期的实现方法

[InitializeSimpleMembership]
public class DataController : Controller
{ ... }

这里有一个更好的解释:

以下是您需要做的全部工作:

  • AccountController
  • WebSecurity.InitializeDatabaseConnection(…)
    调用从/Filters/InitializeSimpleMembershipAttribute.cs(第39行)复制到/AppStart/AuthConfig.cs
  • 请随时从项目中删除InitializeSimpleMembershipAttribute.cs
  • 您不必将
    InitializeDatabaseConnection()
    调用添加到
    AuthConfig.RegisterAuth()
    中,但它似乎是一个合乎逻辑的地方,可以让您的Global.asax更干净


    实际上,您要做的是从原始属性提取初始化调用,并在应用程序启动时显式调用它。属性中的所有其他内容都只是条件检查,以防您不使用(或不需要)SimpleMembership。

    首先,您必须在web.config中设置您的角色和成员资格提供程序:

    <authentication mode="Forms">
      <forms loginUrl="/Account/Login" slidingExpiration="true" timeout="60" />
    </authentication>
    <membership defaultProvider="p1">
      <providers>
        <add name="p1" type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData"/>
      </providers>
    </membership>
    <roleManager enabled="true" defaultProvider="p1">
      <providers>
        <add name="p1" type="WebMatrix.WebData.SimpleRoleProvider, WebMatrix.WebData"/>
      </providers>
    </roleManager>
    
    SimpleMembershipProvider的解决方案是相同的:

    SimpleMembershipProvider msp = new SimpleMembershipProvider(Membership.Provider);
    

    在我的情况下,我必须在IIS身份验证设置中禁用匿名身份验证

    然后我必须启用窗体和Windows身份验证。当然,这将取决于您的应用程序需要哪种身份验证


    一旦我这样做了,错误就消失了,应用程序按预期工作。

    这真的不像它需要的那样清楚。我查看了链接,但它与我正在做的事情无关(我想是吧?),因为我不想创造一个角色。我和你有同样的问题,我收到一条“不能打两次电话”的信息,但当我拿出“第二个”时,我收到了“你必须打电话…”的信息。“您必须调用…”消息的崩溃之处是:如果(OAuthWebSecurity.Login(result.Provider,result.ProviderUserId,createPersistentCookie:false))有什么想法吗?我可以将
    [InitializeSimpleMembership]
    属性放在控制器的顶部,它现在起作用了。很好的解释,兄弟。但是这样做的后果是什么?我想这是有原因的。
    SimpleRoleProvider srp = new SimpleRoleProvider(Roles.Provider);
    
    SimpleMembershipProvider msp = new SimpleMembershipProvider(Membership.Provider);