Visual studio 2013 VS2013 MVC 5模板:使用会话将索赔从ExternalLoginCallback保存到ExternalLoginConfirmation是否错误

Visual studio 2013 VS2013 MVC 5模板:使用会话将索赔从ExternalLoginCallback保存到ExternalLoginConfirmation是否错误,visual-studio-2013,claims-based-identity,asp.net-mvc-5,asp.net-identity,owin,Visual Studio 2013,Claims Based Identity,Asp.net Mvc 5,Asp.net Identity,Owin,在AccountController.cs中 我做了如下修改,以暴露外部声明 public async Task<ActionResult> ExternalLoginCallback(string returnUrl) { var result = await AuthenticationManager.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie);

在AccountController.cs中 我做了如下修改,以暴露外部声明

public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
        {
            var result = await AuthenticationManager.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie); 
            //  ...
             Session["ClaimsIdentity"] = result.Identity; // 
public异步任务ExternalLoginCallback(string returnUrl)
{
var result=wait AuthenticationManager.authenticateSync(DefaultAuthenticationTypes.ExternalCookie);
//  ...
会话[“ClaimsIdentity”]=result.Identity;//
注意,我将ClaimsIdentity放在会话中,因为这是我在中创建用户时使声明可用的唯一方法

 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));
公共异步任务外部登录确认(外部登录确认视图模型,字符串返回URL)
{
// ... 
var result=await UserManager.CreateAsync(用户);
if(result.successed)
{
结果=wait UserManager.AddLoginAsync(user.Id,info.Login);
if(result.successed)
{
索赔实体id=(索赔实体)会话[“标识];
//那么对于id中的每个索赔。。。。
结果=wait UserManager.addsolimesync(user.Id,claim));
此代码的作用是,外部声明根据需要存储在AspNetUserClaims表的DB中。例如,这便于存储来自外部登录声明的电子邮件,而无需明确要求用户提供电子邮件

我的问题:有更好的方法吗?


是否最好使用:
System.Web.HttpContext.Current.Cache
,这样您就可以直接再次检索存储在cookie中的标识。实际上,您可以通过调用相同的结果来执行此操作。在确认操作中,您根本不需要将标识码粘贴到会话中:

var result = await AuthenticationManager.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie); 

因此,您可以直接再次检索存储在cookie中的标识。实际上,您可以通过调用相同的结果来执行此操作。在确认操作中,您根本不需要将标识码粘贴到会话中:

var result = await AuthenticationManager.AuthenticateAsync(DefaultAuthenticationTypes.ExternalCookie); 

好的,谢谢,没问题;正如你所指出的,不需要复制cookie中的内容。我想知道身份验证是否是将ExternalCookie转换为ClaimsEntity的唯一方法?原则上,为了论证而忽略cookie,因为缓存是全局的,所以上下文会话比缓存更好。好的,谢谢,没问题;正如你所指出的,不需要复制cookie中的内容。我想知道身份验证是否是将ExternalCookie转换为ClaimsEntity的唯一方法?原则上,为了论证而忽略cookie,因为缓存是全局的,所以上下文会话比缓存更好。