【问题标题】:.NET HttpContext.User returning wrong type of object.NET HttpContext.User 返回错误类型的对象
【发布时间】: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 并导致以下问题:

  1. 应用程序在未安装 SQL Express 服务器的系统上生成“找不到 SQL 服务器”错误
  2. 在安装 SQL Express Server 的位置,IsInRole 始终返回 false

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

【问题讨论】:

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

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


【解决方案1】:

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

[CustomAuthorize]
public class MyController : Controller

在属性类中创建HttpContext.User

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-17
    • 1970-01-01
    • 2012-03-15
    • 2013-10-30
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多