【问题标题】:Making authorization of roles work after installing Ninject?安装 Ninject 后使角色授权工作?
【发布时间】:2014-07-10 02:11:29
【问题描述】:

我目前正在使用 ASP.NET MVC 5 (C#) 进行我的考试项目。

我的问题是我的控制器之一,它严重依赖授权角色属性来确保人们具有特定角色,从而访问控制器中的各种功能。它工作正常,直到我想通过构造函数使用依赖注入......似乎在我为 mvc3 安装 ninject 之后,设置绑定并使构造函数接受控制器中的接口。它只是忽略所有授权标签?我知道这不是语法错误,因为控制器中没有什么不同,除了新的构造函数。这似乎对帐户控制器没有影响,所以我不得不假设 Ninject 搞砸了。

每个人都可以做他们想做的一切并在控制器中运行所有方法,因为我为 ninject 设置了它,但我根本不明白?

任何人都可以帮助或知道此问题以及解决此问题的任何步骤吗?

我必须在星期一提交项目,所以我希望一些大师能在这个问题上相对快速地启发我。谷歌搜索告诉我 Ninject 不适用于该属性是真的吗?如果是的话我就完蛋了。

好吧,我基本上把它添加到了 NinjectWebCommon 的“RegisterServices”方法中:

kernel.Bind<IChildRepository>().To<ChildRepository>();

(我正在为放学后看孩子的机构做一个网站等。childcontroller 控制系统中创建的“孩子”的管理)。

private readonly IChildRepository _childRepository;

public ChildController(IChildRepository childRepository)
{
    _childRepository = childRepository;
}

这是我的存储库类:

public class ChildRepository : IChildRepository
    {
        ChildContext context = new ChildContext();


    public IQueryable<Child> All
    {
        get { return context.Children; }
    }

    public IQueryable<Child> AllIncluding(params Expression<Func<Child, object>>[]     includeProperties)
    {
        IQueryable<Child> query = context.Children;
        foreach (var includeProperty in includeProperties)
        {
            query = query.Include(includeProperty);
        }
        return query;
    }

    public Child Find(int id)
    {
        return context.Children.Find(id);
    }

    public void InsertOrUpdate(Child child)
    {
        if (child.ChildId == default(int))
        {
            context.Children.Add(child);
        }
        else
        {
            context.Entry(child).State = System.Data.Entity.EntityState.Modified;
        }
    }

    public void Delete(int id)
    {
        var child = context.Children.Find(id);
        context.Children.Remove(child);
    }

    public void Save()
    {
        context.SaveChanges();
    }

    public void Dispose()
    {
        context.Dispose();
    }

}

还有我的回购界面:

public interface IChildRepository : IDisposable
    {
        IQueryable<Child> All { get; }
        IQueryable<Child> AllIncluding(params Expression<Func<Child, object>>[] includeProperties);
        Child Find(int id);
        void InsertOrUpdate(Child child);
        void Delete(int id);
        void Save();
    }

这是控制器方法中的索引方法,向您展示我是如何使用授权的:

    [Authorize(Roles = "Admin, CanEdit")]
    public ActionResult Index()
    {
        return View(_childRepository.All.ToList());
    }

它现在如何运作?不用登录系统就可以访问子控制器视图和除索引之外的所有其他方法?

【问题讨论】:

  • 我尝试创建一个新的 MVC 5 项目并添加了 Ninject.MVC3 包和 [Authorize] 属性在应用于控制器类或特定操作时效果很好。您能否提供一些用于注册依赖项的代码?
  • 更新了一些代码
  • 你在RegisterServices方法中注册了其他依赖吗?您可以尝试在控制器构造函数中创建ChildRepository 并删除接口作为参数吗?只是看看它是否改变了什么。
  • 不,除此之外,我在 registerservices 方法中没有做任何其他事情,一旦我将接口作为参数删除并在构造函数中初始化 repo,一切正常。当我尝试手动访问子控制器方法时,会弹出登录屏幕。所以它是以某种方式导致这种情况的ninject:/
  • 没有建议?对它进行搜索并没有真正引导我找到任何类型的解决方案:/我想如果我不能让它工作,我可能不得不完全排除单元测试,这在我的考试中看起来很糟糕。我的角色授权是我网站的基础。

标签: c# asp.net-mvc roles authorize


【解决方案1】:

我通过谷歌搜索找到了问题的解决方案,显然将这一行添加到 registerservices 方法可以解决整个问题。

kernel.Bind<IFilterProvider>().To<FilterAttributeFilterProvider>();

从我现在爱的这个人那里得到的: http://pieterderycke.wordpress.com/2012/03/01/using-asp-net-filters-with-the-ninject-depencency-resolver/

以为我会自己回答这个问题,所以如果其他人遇到同样的问题,他们可以解决问题!

【讨论】:

  • 这很奇怪,因为IFilterProvider 绑定在Ninject.Web.MvcMvcModule 类中,并且该模块由Ninject 内核自动加载。无论如何,我很高兴你解决了你的问题。
  • 我无法解释为什么它比那篇文章效果更好,但它确实解决了问题,最后你还能问什么。
猜你喜欢
  • 1970-01-01
  • 2020-11-12
  • 2015-04-26
  • 2014-05-08
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 1970-01-01
  • 2012-05-11
相关资源
最近更新 更多