.NET HttpContext.User返回错误类型的对象

时间:2015-08-12 16:46:03

标签: c# asp.net .net asp.net-mvc security

我有一个使用C#和MVC在VS中开发的Web应用程序,我有一个自定义角色提供程序。这已成功运作了好几年。需要时,使用以下方法检查角色:

[HttpPost]
[CustomAuthorize(Roles = "admin, dataPerinatal, perinatalAllCases")]
public ActionResult PerinatalDataEntrySummary()
{
    IPrincipal principal = HttpContext.User;
    bool isAdmin = false;
    bool canViewAll = false;
    if (principal.IsInRole("admin"))
    {
        isAdmin = true;
    }
    else if (principal.IsInRole("perinatalAllCases"))
    {
        canViewAll = true;
    }
    // ....
}

这会将principal作为System.Security.Principal.GenericPrincipal类型的对象返回。

这没有问题。

但是,我刚刚在相同的控制器中添加了 new 方法,并使用相同的代码来获取principal

[HttpPost]
public ActionResult FindCaseFromID(string nIMACHCaseID, string mBRRACECaseID)
{

    principal = HttpContext.User

    bool canViewAll = false;
    if (principal.IsInRole("perinatalAllCases")) 
    { canViewAll = true; }
     // ....
}

但是,这会将principal作为System.Web.Security.RolePrincipal类型的对象返回。这使用AspNetSqlRoleProvider并导致以下问题:

  1. 应用程序在未安装SQL Express服务器的系统上生成“无法找到SQL服务器”错误
  2. 在安装SQL Express Server的地方,IsInRole始终返回false
  3. 如何确保HttpContext.User的每个实例都返回我需要的对象类型。当其他所有内容看起来相同时,为什么第二个实例返回不同的对象类型?

1 个答案:

答案 0 :(得分:0)

答案结果证明是一个简单的代码错误。我的所有控制器都有一个自定义属性[CustomAuthorize]用于整个控制器。

[CustomAuthorize]
public class MyController : Controller

在属性类中创建HttpContext.User

初始方法的属性包括角色检查(参见上文),但是整个类声明中缺少该属性,因此第二种方法使用默认角色提供程序。一旦我添加了属性,问题就消失了。