MVC 5 OWIN - IsAuthenticated在外部登录时为false(QQ Connect)

时间:2014-08-31 16:51:16

标签: asp.net-mvc oauth-2.0 asp.net-mvc-5 owin

我希望有人可以帮我解决这个问题 - 这让我很生气! :)

我尝试使用tinysnake的QQ Connect提供商通过QQ Connect(OAuth 2.0)进行外部登录:https://github.com/tinysnake/microsoft-owin-security-qq

一切似乎都很好 - 我可以通过我的QQ帐户登录,然后我会回复到我的ExternalLoginCallBack方法,并提供适当的索赔等。 我使用这些值通过IAuthenticationManager对用户进行签名 - 一切顺利。但是 - 当我将用户重定向到另一个页面并检查他是否已登录时 - 我从IsAuthenticated值中得到一个错误的值...而且我无法读取我之前设置的任何声明。

这可能是一个简单的修复 - 但我现在无法看到它:)

一些代码:

AuthConfig:

public static void ConfigureAuthentication(IAppBuilder app)
{
    app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

    // Normal cookie sign in
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
        LoginPath = new PathString("/Account/Login"),
        AuthenticationMode = AuthenticationMode.Active
    });

    // QQ CONNECT
    app.UseQQConnectAuthentication(
        appId: "XXXXXX",
        appSecret: "XXXXXXXXXXXXXXXXX");
}

的AccountController:

//
// POST: /Account/ExternalLogin
[System.Web.Mvc.HttpPost]
[System.Web.Mvc.AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult ExternalLogin(string provider, string returnUrl)
{
    // Request a redirect to the external login provider
    return new ChallengeResult(provider, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl }));
}

//
// GET: /Account/ExternalLoginCallback
[System.Web.Mvc.AllowAnonymous]
[HostAuthentication(DefaultAuthenticationTypes.ExternalCookie)]
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
    var ctx = Request.GetOwinContext();
    var result = ctx.Authentication.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie).Result;
    var claims = result.Identity.Claims.ToList();
    var name = claims.First(i => i.Type == "urn:qqconnect:name");

    claims.Add(new Claim(ClaimTypes.AuthenticationMethod, "QQ"));
    claims.Add(new Claim(ClaimTypes.Name, name.Value));

    var ci = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ExternalCookie);
    ctx.Authentication.SignIn(ci);

    // DO OTHER STUFF HERE

    return Redirect("~/");
}

到目前为止一切似乎都很顺利......

HomeController中:

public ActionResult Index()
{
    var model = new HomeViewModel();

    var ctx = Request.GetOwinContext();
    if (ctx.Authentication.User.Identity.IsAuthenticated)  // <-- THIS RETURNS FALSE
    {
        var claimsIdentity = User.Identity as ClaimsIdentity;
        model.Name = claimsIdentity.FindFirst(ClaimTypes.Name).Value;
        model.IsAuthenticated = true;
    }

    return View(model);
}

当我检查ctx.Authentication.User.Identity.IsAuthenticated时,我得到一个错误的值......我也无法检索任何声明。

我错过了什么吗?

任何帮助都将非常感谢:)

更新

我通过在AccountController中执行此操作来获取代码:

public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
    var ctx = Request.GetOwinContext();
    var result = ctx.Authentication.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie).Result;

    if (result.Identity.IsAuthenticated)
    {
        // Signed in successfully
        var claims = result.Identity.Claims.ToList();
        var name = claims.First(i => i.Type == "urn:qqconnect:name");

        //claims.Add(new Claim(ClaimTypes.AuthenticationMethod, "QQ"));
        claims.Add(new Claim(ClaimTypes.Name, name.Value));

        var id = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
        var authenticationManager = ctx.Authentication;
            authenticationManager.SignIn(id);

    }

    return Redirect("~/");
}

但是我看到它的方式 - 在这里我使用ApplicationCookie而不是ExternalCookie进行登录......或者我完全错过了什么? 这个解决方案对我有用 - 但是我想知道这是否是正确的方法呢?

0 个答案:

没有答案