gpt4 book ai didi

c# - 如何将信息从 OnAuthenticated 事件传递到 Controller 和登录?

转载 作者:行者123 更新时间:2023-11-30 13:26:37 25 4
gpt4 key购买 nike

因为我found out here , 我不能打电话

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

在 FacebookAuthenticationProvider OnAuthenticated 事件中。这似乎是一个不同的上下文。

我的用户将来自 Facebook,这意味着我将需要检索数据,例如 idemail...这些信息可在 上访问OnAuthenticated 事件,我需要此信息才能登录。

我需要在我的 Controller 上访问这些信息...

我在事件中试过这个:

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

但在 Controller 上,如果我尝试检索它,它是空的。

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

所以我的问题是,如何将这些数据传递给 Controller ​​以便我可以登录?

最佳答案

我找到了一种方法来做到这一点 by looking at this answer并弄清楚我能做什么。

使用 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);
}

然后在我的 Controller 上,我可以通过使用它来获得该身份

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

随时取回我需要的东西。

关于c# - 如何将信息从 OnAuthenticated 事件传递到 Controller 和登录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19758485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com