【问题标题】:ASP.NET Core 2.2 User.Identity has a value in razor but not in controllerASP.NET Core 2.2 User.Identity 在剃刀中有一个值,但在控制器中没有
【发布时间】:2019-09-17 03:58:55
【问题描述】:

我有一个带有 Windows 身份验证的 asp.net core 2.2 mvc 项目设置, 我的剃须刀布局有这个 @User.Identity.Name 效果很好,但在我的控制器中,User.Identity 为空!知道我做错了什么吗?

这是我的控制器的示例:

using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
using UI.Models;

namespace UI.Controllers
{

    public class HomeController : Controller
    {
        string shortName = string.Empty;

        public HomeController()
        {
            shortName = User.Identity.Name;
        }
        public IActionResult Index()
        {
            return View();
        }
    }
}

【问题讨论】:

标签: c# asp.net-mvc asp.net-core


【解决方案1】:

您不能在控制器的构造函数中访问UserHttpContext 或其他相关属性。这意味着您只能在实际控制器 action 中访问这些属性,例如您的 Index 方法。

要理解这一点,您需要了解这些控制器属性实际上是如何工作的,以及框架将如何管理控制器的生命周期。您可能知道,控制器是短暂的对象,仅在单个请求期间临时创建。这意味着它们将始终在单个请求的范围内执行。

按照这种逻辑,访问 HTTP 上下文的用户或其他属性应该可以正常工作;通常是这样。但是,当您从 ControllerControllerBase 继承这些属性时,它们就没有神奇的值了。相反,它们将在创建控制器后由框架显式设置。

其逻辑与此类似:

// create the controller with its dependencies
var controller = CreateController<HomeController>();

// set the controller context
controller.ControllerContext = context;

// invoke action
controller.Index();

所以当对象被构造并且构造函数运行时,你可以访问任何与控制器直接依赖的东西,因为依赖注入容器将通过构造函数注入提供所有这些值。

其他任何东西都不会自动可用。这包括您从ControllerControllerBase 继承的所有默认属性。这些通常由ControllerContext 隐式设置,因此您必须等待框架设置这些。

由于在构造函数运行之前无法设置属性值,因此您将无法在构造函数中访问任何这些值。所以解决方案是将逻辑转移到一个动作中。这样,您就可以访问属性并且它们将具有正确的值。

public class HomeController : Controller
{
    public IActionResult Index()
    {
        var shortName = User.Identity.Name;
        return View();
    }
}

【讨论】:

    猜你喜欢
    • 2018-08-28
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-15
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多