你必须调用“WebSecurity.InitializeDatabaseConnection”......但我已经有了

时间:2013-03-31 02:50:49

标签: asp.net-mvc-4 asp.net-web-api simplemembership webmatrix-2

我已经阅读了关于这个主题的一些SO问题,但似乎所有人都在处理你应该把这个电话放在哪里。

我的问题有所不同:我已经完成了WebSecurity.InitializeDatabaseConnection()调用,并设置了断点,所以我知道它已被执行。但我仍然得到invalid operation exception说我必须称之为。

与MVC控制器操作中包含它的大多数其他问题不同,我遇到了HttpModule我编写的用于完成REST WebAPI控制器的身份验证的问题。 Init调用包含WebSecurity.InitializeDatabaseConnection调用。然后OnAuthenticationRequest方法从请求的Authorization标头中提取用户名和密码信息,并调用ValidateUser的{​​{1}}方法。这是我得到异常的地方

  

您必须调用SimpleMembershipProvider方法   在调用WebSecurity.InitializeDatabaseConnection类的任何其他方法之前。

所以

a)为什么在我已经满足不满足条件的情况下,我会收到此异常    b)可以做些什么呢?

2 个答案:

答案 0 :(得分:1)

面对同样的问题并设置了许多断点后,我找到了适合我环境的解决方案,我希望其他人可以从中受益:

在文件夹App_Start

public class FilterConfig
{
  public static void RegisterGlobalFilters(GlobalFilterCollection filters)
  {
    var attr=new InitializeSimpleMembershipAttribute();
    // here is the important part
    attr.OnActionExecuting(new ActionExecutingContext());
    filters.Add(attr);
  }
}

背景:在我的应用中,我有2个观点:

  • /帐户/注册:这是标准asp.mvc 4模板的一部分,其属性为[AllowAnonymous]
  • /任务:这是Todo-list的“索引” - 视图,TaskController具有[Authorize(Roles =“Administrator”)]属性

我总是遇到以下情况中的问题:

  1. 在浏览器中调试会话
  2. 成功登录
  3. 打开需要授权的视图“/ Task”
  4. 切换到visual studio并保持浏览器打开
  5. 停止调试
  6. 更改控制器内部的一些代码(设置一些空格就足够了)
  7. 开始调试会话
  8. 在浏览器中按刷新
  9. 此时尚未调用类InitializeSimpleMembershipAttribute中的方法“OnActionExecuting”(通过设置断点确定)!

    但是当我打开一个不需要授权的View(即/ Account / Register)时,调用了方法“OnActionExecuting”。在此之后我可以毫无错误地调用/ Task。

    因此解决方案是在应用程序启动时为“OnActionExecuting”创建一个“伪调用”。

答案 1 :(得分:0)

每次调用HttpModule时都不需要初始化数据库连接。只需在应用程序启动时执行一次。这是一个article that explains how to use SimpleMembership for authentication/authorization of Web API calls。还有一个示例项目源代码的链接。