当User.IsAuthenticated = false时,MVC 5中的OWIN身份验证循环

时间:2014-04-22 02:03:09

标签: authentication asp.net-mvc-5 owin

我正在尝试在MVC 5.1应用程序中实现身份验证和授权。身份验证通过自定义实施的Facebook进行。 (如果需要,我可以发布该代码。)一旦FB验证并发回代码,调用auth服务的Authenticate方法就可以将用户签入应用程序。应用程序本身没有授权代码(因此不使用身份或其他成员资格服务)。

    public async Task<ActionResult> Connect(string code)
    {
        if (code == null)
        {
            return RedirectToAction("Index", "Home");
        }
        else
        {
            // get access token
            var accessToken = await nApplication.FacebookClient.AccessTokenAsync(code);
            // get user info from facebook
            var meResult = await nApplication.FacebookClient.MeResultAsync(accessToken);

            nApplication.NRepository.SaveChanges();
            nAuthorization.Authenticate(member);

            return RedirectToAction("Index");
        }
    }

nAuthorization.Authenticate(member);创建声明列表并执行OWIN SignIn

    claims.Add(new Claim(ClaimTypes.Name, member.Name));
    claims.Add(new Claim(ClaimTypes.Role, "Member"));
    var claimIdentity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
    owinContext.Authentication.SignIn(new AuthenticationProperties { IsPersistent = true }, claimIdentity);

我正在使用Authorize命名空间中的Mvc属性。但此时/Profile/Authenticate/这是我的Owin LoginPath一次又一次地被调用以将用户重定向到FB并返回上面的Connect方法。

    [Authorize(Roles = "Member")]
    public async Task<ActionResult> Index(int? id)

我检查了控制器中的User属性,但未经过身份验证。我可以将其设置为新的ClaimsPrincipal,但我希望验证码独立于HttpContext。它似乎不是正确的解决方案。

我的Startup课程包含:

    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        LoginPath = new PathString("/Profile/Authenticate/"),
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        CookieSecure = CookieSecureOption.Always,
        ReturnUrlParameter = "next"
    });

也许我错过了一些完全基本的东西?任何指针都会有所帮助,我查看了以下文章,但无济于事:

1 个答案:

答案 0 :(得分:1)

我认为这将解决您的问题...它对我有用:

在global.asax.cs文件中添加一个空方法:

protected void Session_Start()
{
}

出于某种原因,如果没有这个,asp.net会话cookie不会在适当的时间设置。 Thinktecture开发人员认为,如果您的webapp使用http并且您的身份提供商使用https但我尚未验证,那么可能会发生这种情况。