【发布时间】:2020-04-15 20:51:13
【问题描述】:
我正在编写一个 aspnet core 1 应用程序。
使用不记名令牌身份验证,我在控制器内拥有具有正确身份的 User 属性。但是,我似乎无法像使用 ClaimPrincipal.Current 静态之前那样找到一种获取身份的方法。
在不传递 ClaimPrincipal 对象的情况下,在 BL 层中获取这些数据的当前最佳做法是什么?
【问题讨论】:
我正在编写一个 aspnet core 1 应用程序。
使用不记名令牌身份验证,我在控制器内拥有具有正确身份的 User 属性。但是,我似乎无法像使用 ClaimPrincipal.Current 静态之前那样找到一种获取身份的方法。
在不传递 ClaimPrincipal 对象的情况下,在 BL 层中获取这些数据的当前最佳做法是什么?
【问题讨论】:
进一步调查这个问题,我发现可以使用本机 DI 容器在需要的地方注入 ClaimsPrincipal:
services.AddTransient<ClaimsPrincipal>(s =>
s.GetService<IHttpContextAccessor>().HttpContext.User);
注入它感觉有点奇怪,但是它比将它存储在CallContext 中要好。
【讨论】:
ClaimsPrincipal.Claims 是你想要的
services.AddScoped,尽管它在功能上没有任何改变,但它强调,ClaimsPrincial 无论如何都是范围的。
以下是 dotnet core 2.0 及更高版本的更好答案:https://adamstorr.azurewebsites.net/blog/are-you-registering-ihttpcontextaccessor-correctly
基本上将 IHttpContextAccessor 作为 Singleton 添加到服务中:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddHttpContextAccessor();
}
将 IHttpContextAccessor 注入到你的类中:
public class YourService : IYourService {
private readonly IHttpContextAccessor _httpContextAccessor;
public YourService(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
}
并在您的方法中访问 _httpContextAccessor.HttpContext。
【讨论】:
ClaimsPrincipal 的东西都不应该知道IHttpContextAccessor。
YourService。然后YourService 返回ClaimsPrincipal。你会认为这是泄漏吗?也许drakkar 没有完全充实这段代码。我想我们可能需要services.AddTransient<IYourService, YourService>();,这样我们就可以将 YourService 用作其他服务的依赖项?
YourService 是什么。如果它只是像ClaimContainer 这样的声明的抽象,它实际上并没有泄漏。如果您的实际服务需要声明并且它依赖于IHttpContextAccessor,那么这就是泄漏。