我需要为ASP创建单元测试.NETMVC2.0网站.该网站使用Windows身份验证.

我一直在研究为处理HttpContext的代码模拟HTTP上下文的必要性.我觉得我也开始掌握DI模式了.(赋予该类一个IRepository类型的属性,然后在实例化控制器时传入一个Repository对象.)

然而,我不理解的是,锁定可通过User.Identity获得的Windows主体对象的正确方式.这是HttpContext的一部分吗?

有没有机构有链接到一篇说明这一点的文章(或推荐一本书)?

谢谢

特雷·卡罗尔

推荐答案

我用IoC成功地将其抽象出来.我首先定义了一个类来表示当前登录的用户:

public class CurrentUser
{
    public CurrentUser(IIdentity identity)
    {
        IsAuthenticated = identity.IsAuthenticated;
        DisplayName = identity.Name;

        var formsIdentity = identity as FormsIdentity;

        if (formsIdentity != null)
        {
            UserID = int.Parse(formsIdentity.Ticket.UserData);
        }
    }

    public string DisplayName { get; private set; }
    public bool IsAuthenticated { get; private set; }
    public int UserID { get; private set; }
}

在构造函数中设置其值需要IIdentity.对于单元测试,可以添加另一个构造函数,以允许绕过IIdentity依赖项.

然后我使用Ninject( Select 你最喜欢的IoC容器,没关系),并为IIdentity创建了一个绑定:

Bind<IIdentity>().ToMethod(c => HttpContext.Current.User.Identity);

然后,在我的控制器内部,我在构造函数中声明依赖关系:

CurrentUser _currentUser;

public HomeController(CurrentUser currentUser)
{
    _currentUser = currentUser;
}

IoC容器看到HomeController接受CurrentUser对象,CurrentUser构造函数接受IIdentity.它会自动解决依赖关系,瞧!控制器可以知道当前登录的用户是谁.对我来说,FormsAuthentication似乎很管用.您可以将此示例改编为Windows身份验证.

Asp.net相关问答推荐

JWT 和 Google 在 Razor 页面中进行身份验证和授权

如何根据另一个下拉列表中的 Select 从下拉列表中删除一个值?

是否可以发布 ASP.NET 5 应用程序以使目标机器不需要安装 DNX?

获取没有主机的 url 部分

如何在 ASP.NET core rc2 中禁用浏览器缓存?

从 IIS 7/8 中的静态内容中删除服务器标头

使用 gridview asp.net 进行排序和分页

学习什么 - Ruby on Rails 或 ASP .NET MVC...鉴于熟悉 ASP .NET

如何从 JS 访问 ViewBag

是否应该将 project.lock.json 文件签入源代码管理? (ASP.NET 核心 1.0)

如何在新实现的接口或基类之间做出决定?

如何在 IIS 7.5 上使用 ASP.NET 表单身份验证保护静态文件?

如何从 SQL Server 2008 本身获取客户端 IP 地址?

在 ASP.NET 4.5 WebForms 中通过 bundle.config 与 BundleConfig.cs Bundle 资源

等价于 ASP.NET Core 中的 Html.RenderAction

如何验证用户在 CheckBoxList 中 Select 了至少一个复选框?

要调用此方法,Membership.Provider属性必须是ExtendedMembershipProvider的实例

VS 2010 中缺少 App_Code 文件夹

在 Visual Studio 2010 中随机禁用编辑 aspx/ascx 文件?

x-powered by是什么意思?