在 ASP.NET 5 beta 6 控制器中获取当前用户

Get current user in ASP.NET 5 beta 6 controller

对于 ASP.NET 5 beta 6,创建控制器时似乎不再扩展控制器 (Microsoft.AspNet.Mvc.Controller)。那么我如何才能访问当前用户呢?以前我只是使用 "User" 属性 off Controller 来获取与执行操作关联的用户的 System.Security.Claims.ClaimsPrincipal。没有控制器,现在 "User" 不再定义。

在 Beta 5 中有效:

[Authorize]
[Route("[controller]")]
public class UserDetailsController : Controller
{
    [HttpGet]
    public JsonResult Get()
    {
        var user = User as ClaimsPrincipal;
        var claims = from c in user.Claims
                     select new
                     {
                         type = c.Type,
                         value = c.Value
                     };

        return new JsonResult(claims);
    }
}

在 Beta 6 中不起作用:

[Authorize]
[Route("[controller]")]
public class UserDetailsController
{
    [HttpGet]
    public JsonResult Get()
    {
        var user = User as ClaimsPrincipal; // ERROR - The name 'User' does not exist in the current context
        var claims = from c in user.Claims
                     select new
                     {
                         type = c.Type,
                         value = c.Value
                     };

        return new JsonResult(claims);
    }
}

所以我今晚花了比我想承认的更长的时间来寻找如何使用新的 POCO 样式控制器访问当前用户的答案,当然在我发布问题后不久我偶然发现了答案通读 ASP.NET 的 announcements repo。希望这可以帮助其他人。

POCO 风格的控制器应该是:

[Authorize]
[Route("[controller]")]
public class UserDetailsController
{
    [ActionContext]
    public ActionContext ActionContext { get; set; }

    public HttpContext HttpContext => ActionContext.HttpContext;

    [HttpGet]
    public JsonResult Get()
    {
        var user = HttpContext.User;
        var claims = from c in user.Claims
                     select new
                     {
                         type = c.Type,
                         value = c.Value
                     };

        return new JsonResult(claims);
    }
}

在 beta6 中,Controller 基础 class 不再与 Microsoft.AspNet.Mvc.Core 包一起提供,而是与 Microsoft.AspNet.Mvc.ViewFeatures 包一起提供。

因此添加对 Microsoft.AspNet.Mvc.ViewFeatures 的引用将解决您的问题。 Controller class 仍然存在于 Microsoft.AspNet.Mvc 命名空间中。

另请参阅此公告:Refactoring of MVC packages