使用AspNet.Identity 3.0登录后,为什么User.Identity为null

时间:2016-01-19 14:19:14

标签: asp.net-mvc asp.net-web-api asp.net-identity claims-based-identity dnx

我在DNX RC1中使用Microsofts AspNet.Identity 3.0框架。在一些教程的帮助下,我构建了一个自定义身份验证系统。密码成功检查后,会为用户创建一些声明,并设置身份验证:

var claimsPrincipal = await SignInManager.CreateUserPrincipalAsync(user);
if (claimsPrincipal != null && claimsPrincipal.Identity != null)
{
    // Set the claims to the user 
    await HttpContext.Authentication.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, claimsPrincipal);
    return RedirectToAction("Index", "App");
}

此登录操作后,我的浏览器有两个cookie: .AspNet.Cookies .AspNet.Microsoft.AspNet.Identity.Application

但是我的身份确实存在问题。用[授权]注释的控制器根本不执行。带有[AllowAnonymous]的控制器给我一个NullReferenceException,因为User.Identity为null:

[AllowAnonymous]
[Route("api/trips")]
public class TripController : Controller
{

[HttpGet("")]
public JsonResult Get()
{
    var trips = _repository.GetUserTripsWithStops(User.Identity.Name);
    ...

    return Json(results);
}

有人可以告诉我我的身份验证有什么问题吗?

我猜我的错误在Startup.cs文件中的某处 - 这是configure方法:

public void Configure(IApplicationBuilder app)
{
    app.UseStaticFiles();

    app.UseIdentity();
    app.UseCookieAuthentication(options =>
    {
        options.LoginPath = new PathString("/App/Login");
    });

    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller}/{action}/{id?}",
            defaults: new { controller = "App", action = "Index" });
    });
}

2 个答案:

答案 0 :(得分:0)

要访问User对象,必须使用[Authorize]修饰控制器/操作。 [AllowAnonymous]仅适用于[Authorize]。它本身没有任何作用,因为默认情况下,匿名用户可以访问所有内容。

答案 1 :(得分:-1)

感谢上帝,经过一天多的试验和错误,我找到了解决方案。最后,我在Startup.cs文件中添加了AutomaticAuthenticate-line:

app.UseCookieAuthentication(options =>
{
    options.AutomaticAuthenticate = true;
    options.LoginPath = new PathString("/App/Login");
});