我有一个使用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
并导致以下问题:
IsInRole
始终返回false
。如何确保HttpContext.User
的每个实例都返回我需要的对象类型。当其他所有内容看起来相同时,为什么第二个实例返回不同的对象类型?
答案 0 :(得分:0)
答案结果证明是一个简单的代码错误。我的所有控制器都有一个自定义属性[CustomAuthorize]
用于整个控制器。
[CustomAuthorize]
public class MyController : Controller
在属性类中创建HttpContext.User
。
初始方法的属性包括角色检查(参见上文),但是整个类声明中缺少该属性,因此第二种方法使用默认角色提供程序。一旦我添加了属性,问题就消失了。