在AccountController.cs中我根据孙宏业的代码进行了修改,以便暴露外部声明。
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
var result = await AuthenticationManager.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie);
// ...
Session["ClaimsIdentity"] = result.Identity; //
注意,我把ClaimsIdentity放在Session中,因为这是我在中创建用户时使Claims可用的唯一方法
public async Task<ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl)
{
// ...
var result = await UserManager.CreateAsync(user);
if (result.Succeeded)
{
result = await UserManager.AddLoginAsync(user.Id, info.Login);
if (result.Succeeded)
{
ClaimsIdentity id = (ClaimsIdentity)Session["Identity"];
// then for each Claim claim in id ....
result = await UserManager.AddClaimAsync(user.Id, claim));
此代码的效果是根据需要将外部声明存储在AspNetUserClaims表的DB中。例如,这对于存储来自外部登录声明的电子邮件非常方便,而无需明确要求用户提供电子邮件。
我的问题是:有更好的方法吗
是否更好地使用:System.Web.HttpContext.Current.Cache
因此,您可以直接再次检索存储在cookie中的标识。实际上,您可以通过调用相同的结果来实现这一点。确认操作中的身份码,您根本不需要将其粘贴到会话中:
var result = await AuthenticationManager.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie);