How to transfer information from the OnAuthenticated event to the controller and SignIn?

As I found here , I can’t call

HttpContext.GetOwinContext().Authentication.SignIn(...)

in the FacebookAuthenticationProvider event OnAuthenticated. This seems to be a different context.

My users will be from Facebook, which means that I will need to get data, such as id, email... This information is available in the event OnAuthenticated, and I need this information to enter the system.

I need to access this information on my controller ...

I tried this in the case of:

context.OwinContext.Set("FacebookUser", rawUserObjectFromFacebookAsJson);

But on the controller, if I try to restore it, it is zero.

var fbuser = HttpContext.GetOwinContext()
                 .Get<Newtonsoft.Json.Linq.JObject>("FacebookUser");

So my question is: how do I pass this data to the controller so that I can log in?

+2
1

, .

Claims, , Facebook, .

OnAuthenticated = (context) =>
{
    const string XmlSchemaString = "http://www.w3.org/2001/XMLSchema#string";

    var rawUserObjectFromFacebookAsJson = context.User;

    context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:access_token", context.AccessToken, XmlSchemaString, "Facebook"));
    foreach (var x in context.User)
    {
        var claimType = string.Format("urn:facebook:{0}", x.Key);
        string claimValue = x.Value.ToString();
        if (!context.Identity.HasClaim(claimType, claimValue))
            context.Identity.AddClaim(new System.Security.Claims.Claim(claimType, claimValue, XmlSchemaString, "Facebook"));

    }

    return Task.FromResult(0);
}

,

ClaimsIdentity identity = await HttpContext.GetOwinContext().Authentication
    .GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);

[AllowAnonymous]
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
    ClaimsIdentity identity = await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);

    var user = new IdentityUser()
    {
        Id = identity.GetUserId(),
        UserName = identity.Name,
    };

    await LoginAsync(user, identity);

    if (!identity.IsAuthenticated)
    {
        return RedirectToAction("Login");
    }

    return RedirectToAction("Index", "Home");
}

LoginAsync

private async Task LoginAsync(IdentityUser user, ClaimsIdentity identity)
{
    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);

    // I can't just use the identity I got on Facebook
    // I need to create this one, or else it will not signin properly
    // The authentication type has to be ApplicationCookie and the property
    // is readonly, so...
    var userIdentity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);

    // now we have to transfer the claims, adding a check to avoid duplicates
    foreach (var claim in identity.Claims)
    {
        if (!userIdentity.HasClaim(c => c.Type == claim.Type))
            userIdentity.AddClaim(claim);
    }

    // then it will signin successfully
    AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = true }, userIdentity);
}

HttpContext.GetOwinContext().Authentication.User.Claims

, .

+11

Source: https://habr.com/ru/post/1016465/


All Articles