Thread.CurrentPrincipal Identity.Name 在 asp.net mvc 6 (vNext



我正在使用 Asp.Net MVC6(vNext),Identity 3.0.* beta3开发一个Web应用程序。这是具有 UI、服务和数据库的 3 层应用程序。我能够使用 Asp.net 标识类登录用户SignInManager并且我正在尝试检索服务层中的角色和声明的用户详细信息,以便我可以验证用户是否有权执行某些操作。

我们如何从服务层中的当前请求主体身份获取当前用户名。在 MVC 5 中,我使用了 Thread.CurrentPrincipal 来执行此操作。但在 MVC6 中,Thread.CurrentPrincipalIdentity.Name设置为 null。

有人可以让我知道我该怎么做吗? 另外,如果您有更好的解决方案,请告诉我。

如果您在 Startup 中调用了AddIdentity().cs或者在您配置依赖项注入的任何位置,它将自动注册满足IHttpContextAccessor服务的单一实例HttpContextAccessor

此时,在服务层中,您可以注入IHttpContextAccessor并从中检索上下文。 这假设您了解依赖关系注入系统的工作原理,并使用它来实例化服务层类,而不仅仅是new它们。

如果希望能够方便地访问HttpContext中公开的ClaimsPrincipalIdName,请确保导入System.Security.Claims以便有权访问提供GetUserName()GetUserId()扩展方法的扩展。

(这是截至VS2015 RC1发布的beta4软件包的最新数据)

假设您可以在层中传递访问服务,则 HttpContext.Current 的等效项是 IHttpContextAccessor.HttpContext,它是托管层公开的服务。

也许有更好的方法。但是现在我正在添加一个自定义中间件,如下面的代码所示,以在 startup.cs 类的当前线程中注入 ussername。在服务层中,我将使用 Thread.GetData(Thread.GetNamedDataSlot("current-username"))读取它。

public class Startup {
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerfactory)
    {
        //.... code
        app.UseIdentity();
        //... more code
        app.Use(async (ctx, next) =>
        {
            var httpContext = (ctx as HttpContext);
            if (httpContext.User.Identity.IsAuthenticated)
            {
                Thread.SetData(Thread.GetNamedDataSlot("current-username"), httpContext.User.Identity.Name);
            }
            await next();
        });
        //... more code
        app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "{controller}/{action}/{id?}",
                    defaults: new { controller = "Home", action = "Index" });
            });
    }
}

最新更新