【发布时间】:2016-05-10 14:26:48
【问题描述】:
在使用 Simple Injector 请求到达控制器之前,是否可以访问当前主体?我正在使用 OWIN 和 Asp.net 身份。
我有一个 DbContext 注入到我的控制器中,但是这个上下文将根据经过身份验证的用户获取它的连接字符串。这是我目前所拥有的,
container.RegisterWebApiRequest<TenantDbContext>();
container.RegisterWebApiRequest<ITenantConnectionStringProvider>(() => new TenantConnectionStringProvider(container));
然后在我的 TenantConnectionStringProvider 我有这个,
var request = container.GetCurrentHttpRequestMessage();
var principal = request.GetRequestContext().Principal as ClaimsPrincipal;
但是委托人没有权利要求。我意识到只有在创建控制器后才能获得声明。这是否意味着不可能因为这一步发生在控制器创建之前?
编辑: 这基本上就是其余代码的作用:
WebApi 控制器
public CampaignsController(TenantDbContext context, ILog log)
{
this.campaignService = campaignService;
this.log = log;
}
租户上下文(仅从 EF 的 DbContext 继承):
public TenantDbContext(ITenantConnectionStringProvider provider)
: base(provider.GetConnectionString())
{
}
在搞砸了一点之后,我能够做到这一点,但感觉很hacky.. 我添加了一个在身份验证后发生的 OWIN 中间件。我不知道为什么,但我在这里拥有所有经过身份验证的用户信息,但是当它转到 TenantConnectionStringProvider 时,HttpRequestMessage 上没有这些信息。
app.Use(async (context, next) =>
{
using (container.BeginExecutionContextScope())
{
CallContext.LogicalSetData("Claims", context.Authentication.User.Claims);
var request = (OwinRequest)context.Request;
await next();
}
});
然后在我的 TenantConnectionStringProvider 中我只是这样做了,
public string GetConnectionString()
{
var context = (IEnumerable<Claim>)CallContext.LogicalGetData("Claims");
return "test";//get claim from context to get the connection string
}
【问题讨论】:
标签: c# asp.net asp.net-web-api owin simple-injector