【问题标题】:Injecting Current USer using Structuremap Custom Instance使用 Structuremap 自定义实例注入当前用户
【发布时间】:2011-04-16 18:19:10
【问题描述】:

这是我想要做的: 我已经在 ASP.NET MVC 中实现了表单身份验证。我有符合 IPrincipal (System.Security.Principal) 的 IUser 接口。自定义 IUser 具有附加属性,可以视为 DTO。我需要在不同的层使用这个用户。

目前,我的基本控制器检查表单是否经过身份验证并重建 IUser,如 Code1。我将此当前用户传递给服务层,服务层将它们传递给域层,然后到达事件和事件处理程序(域事件)。

所有层都是基于接口的,StructureMap 用作 IoC。 我的 IoC 是一个单独的类库。

我正在寻找一种方法来避免将用户信息传递给每个方法。我发现我可以注入链接http://structuremap.net/structuremap/InstanceExpression.htm#section11中描述的类的自定义实例@

我打算创建一个方法

public void SetCurrentUser(IUser user)
{
    // Something Similart to below ( Below code may be wrong)

    //For<IUser>().TheDefault.IsThis(user);

}

在所有需要了解当前用户的类构造函数中都有 IUser

问题

1) 这是将用户信息传递到所有层的正确方法吗?您认为它会起作用吗?

2) 这样安全吗?一个会话中的用户可以被另一个会话劫持吗?

谢谢,

三月

代码(1)

string[] roles = userData.Split(',');
// Create a new Generic Principal Instance and assign to Current User
IUser _currentUser= new User
{
    IsApplicationUser = Convert.ToBoolean(roles[0].ToString()),
    Role = (UserRole)Enum.Parse(typeof(UserRole), roles[1].ToString()),
    Id = new Guid(ticket.Name),
    Email = roles[3].ToString(),
    Name = roles[2].ToString(),
    CompanyName = roles[4].ToString(),
    DealerId = roles[5].ToString(),
    LocationId  = roles[6].ToString()
};

【问题讨论】:

  • 我能够使用 Joshua Flanagan 的建议成功测试。

标签: asp.net-mvc-2 structuremap n-tier-architecture


【解决方案1】:
For<IUser>().HybridHttpOrThreadLocalScoped().Use( container => {
    buildUserInstanceFromThreadCurrentPrincipal();
});

【讨论】:

  • @Joshua- 哇从来不知道 buildUserInstanceFromThreadCurrentPrincipal() 甚至存在。谢谢你。我今天会试试这个。
  • @Joshua- :-) 跳得太快来不及发表评论。我首先认为 buildUserInstanceFromThreadCurrentPrincipal() 是一个框架方法。
  • @Joshua- 我正在调用我的 IoC 库,它在不同项目中的所有注册表模块上调用 init。我可以调用上述代码的最早生命周期事件是什么?我认为如果我将它放在请求身份验证中,那么它将为每个请求调用,基本控制器似乎仍然是最好的地方。有什么建议吗?
  • @TheMar - 注册码通常放在 Application_Start 中,因为它应该只运行一次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-26
  • 2012-07-10
  • 2014-03-17
相关资源
最近更新 更多