【发布时间】:2015-08-12 16:46:02
【问题描述】:
我有一个使用 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 类型的对象返回。
这没有问题。
但是,我刚刚在 same 控制器中添加了一个 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 并导致以下问题:
- 应用程序在未安装 SQL Express 服务器的系统上生成“找不到 SQL 服务器”错误
- 在安装 SQL Express Server 的位置,
IsInRole始终返回false。
如何确保HttpContext.User 的每个实例都返回我需要的对象类型。为什么第二个实例返回不同的对象类型,而其他一切似乎都相同?
【问题讨论】:
-
如果您在 web.config 中配置了角色提供程序,则会创建角色主体。是这样吗?
-
不,它不在 web.config 中,而是一个自定义提供程序。正如我在问题中所说,它与新方法不同。
-
那么,你能展示一下有效的方法和无效的方法吗?你在使用区域吗?
-
感谢 Brendan,现在添加了代码。是的,我正在使用区域。
-
如何插入自定义角色提供程序?使用表单身份验证和自定义角色提供程序,您应该始终获得 RolePrincipal。
标签: c# asp.net .net asp.net-mvc security