Asp.net 你必须称之为;WebSecurity.InitializeDatabaseConnection“;方法,然后再调用;“网络安全”;班
除了AccountController.cs文件中已经生成的内容外,我无法使WebSecurity对象在任何地方工作。帐户控制器在顶部设置了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()
[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.csInitializeDatabaseConnection()
调用添加到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);