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
这就是你所要做的一切:
[InitializeSimpleMembership]从顶部删除AccountControllerWebSecurity.InitializeDatabaseConnection(...)调用从/Filters/InitializeSimpleMembershipAttribute.cs(第39行)复制到/AppStart/AuthConfig.cs你不具备的添加InitializeDatabaseConnection()调用AuthConfig.RegisterAuth()但它似乎是逻辑的地方,让您的Global.asax清洁.
您实际上正在做的是从原始属性中提取初始化调用并在Application_Start上显式调用它.如果您不使用(或不需要)SimpleMembership,属性中的其他所有内容都只是有条件的检查.
将[InitializeSimpleMembership](如在AccountController中提到的那样)添加到我需要访问WebSecurity的控制器顶部,这对我来说很有用.但是不确定它是否是预期的实现方法...
[InitializeSimpleMembership]
public class DataController : Controller
{ ... }
Run Code Online (Sandbox Code Playgroud)
我在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)
| 归档时间: |
|
| 查看次数: |
30992 次 |
| 最近记录: |