加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

在ASP.NET MVC中模拟User.Identity

发布时间:2020-12-15 19:14:52 所属栏目:asp.Net 来源:网络整理
导读:我需要为一个ASP.NET MVC 2.0网站创建单元测试。该网站使用Windows身份验证。 我一直在阅读模拟处理HttpContext的代码的HTTP上下文的必要性。我觉得我也开始在DI模式上得到一个句柄。 (给类一个类型为IRepository的属性,然后在实例化控制器时传递Repository
我需要为一个ASP.NET MVC 2.0网站创建单元测试。该网站使用Windows身份验证。

我一直在阅读模拟处理HttpContext的代码的HTTP上下文的必要性。我觉得我也开始在DI模式上得到一个句柄。 (给类一个类型为IRepository的属性,然后在实例化控制器时传递Repository对象。)

然而,我不明白,是通过User.Identity Mock可用的Windows Principal对象的正确方法。这是HttpContext的这一部分吗?

任何机构都有一个链接到一个文章,演示这个(或一本书的建议)吗?

谢谢,

Trey Carroll

解决方法

我已经使用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(选择你最喜欢的IoC容器,没关系),并创建了一个IIdentity的绑定:

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

然后,在我的控制器里面我声明在构造函数中的依赖:

CurrentUser _currentUser;

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

IoC容器看到HomeController接受一个CurrentUser对象,CurrentUser构造函数接受一个I??Identity。它将自动解决依赖关系,并中提琴!您的控制器可以知道当前登录的用户是谁。对于我来说,使用FormsAuthentication似乎工作得很好。您可能能够将此示例适用于Windows身份验证。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读