C# .NET HttpContext。用户返回的对象类型错误

C# .NET HttpContext。用户返回的对象类型错误,c#,asp.net,.net,asp.net-mvc,security,C#,Asp.net,.net,Asp.net Mvc,Security,我有一个使用C#with MVC在VS中开发的web应用程序,还有一个自定义角色提供程序。这已经成功运行了好几年。需要时,使用以下方法检查角色: [HttpPost] [CustomAuthorize(Roles = "admin, dataPerinatal, perinatalAllCases")] public ActionResult PerinatalDataEntrySummary() { IPrincipal principal = HttpContext.User;

我有一个使用C#with 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
的对象

这样做没有问题

但是,我刚刚在同一个控制器中添加了一个新方法,并使用相同的代码来获取
主体

[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
,并导致以下问题:

  • 应用程序在未安装SQL Express server的系统上生成“找不到SQL server”错误
  • 如果安装了SQL Express Server,则
    IsInRole
    始终返回
    false

  • 如何确保
    HttpContext.User
    的每个实例都返回我需要的对象类型。为什么第二个实例返回的对象类型不同,而其他所有对象似乎都相同?

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

    [CustomAuthorize]
    public class MyController : Controller
    
    它在属性类中创建
    HttpContext.User


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

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

    [CustomAuthorize]
    public class MyController : Controller
    
    它在属性类中创建
    HttpContext.User


    初始方法具有包含角色检查的属性(请参见上文),但是该属性在类声明中作为一个整体丢失,因此第二个方法使用默认角色提供程序。添加属性后,问题就消失了。

    RolePrincipal是在web.config中配置了角色提供程序的情况下创建的。是这样吗?不,它不在web.config中,而是一个自定义提供程序。正如我在问题中所说,它与新方法不同。那么,你能展示一下有效的方法和无效的方法吗?您正在使用区域吗?谢谢Brendan,代码现在已添加。是的,我正在使用区域。如何插入自定义角色提供程序?使用forms auth和自定义角色提供程序,您应该始终获得RolePrincipal。如果您在web.config中配置了角色提供程序,则会创建RolePrincipal。是这样吗?不,它不在web.config中,而是一个自定义提供程序。正如我在问题中所说,它与新方法不同。那么,你能展示一下有效的方法和无效的方法吗?您正在使用区域吗?谢谢Brendan,代码现在已添加。是的,我正在使用区域。如何插入自定义角色提供程序?使用forms auth和自定义角色提供程序,您应该始终获得RolePrincipal。