4

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

我的问题是不同的:我已经完成了WebSecurity.InitializeDatabaseConnection()调用,并且设置了断点,所以我知道它已经被执行了。但我仍然明白invalid operation exception我必须打电话给它的说法。

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

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

所以

a)当我已经满足不得到它的条件时,为什么我会得到这个例外。
b) 可以做些什么?

4

2 回答 2

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 个视图:

  • /Account/Register:这是标准 asp.mvc 4 模板的一部分,具有 [AllowAnonymous] 属性
  • /Task:这是待办事项列表的“索引”视图,TaskController 具有属性 [Authorize(Roles="Administrator")]

我总是在以下位置遇到问题:

  1. 在浏览器中调试会话
  2. 登录成功
  3. 打开需要授权的视图“/Task”
  4. 切换到 Visual Studio 并保持浏览器打开
  5. 停止调试
  6. 更改控制器内的一些代码(设置一些空格就足够了)
  7. 开始调试会话
  8. 在浏览器中按刷新

此时尚未调用类 InitializeSimpleMembershipAttribute 中的方法“OnActionExecuting”(通过设置断点确定)!

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

所以解决方案是在应用程序启动时为“OnActionExecuting”进行“伪调用”。

于 2013-12-05T16:06:53.513 回答
0

每次调用 HttpModule 时,您都不需要初始化数据库连接。只需在应用程序启动时执行一次。这是一篇文章,解释了如何使用 SimpleMembership 进行 Web API 调用的身份验证/授权。还有一个示例项目的源代码链接。

于 2013-04-02T14:33:33.063 回答