C# .NET HttpContext。用户返回的对象类型错误
我有一个使用C#with MVC在VS中开发的web应用程序,还有一个自定义角色提供程序。这已经成功运行了好几年。需要时,使用以下方法检查角色: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;
[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
,并导致以下问题:
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。