Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Asp.net web表单、Asp身份-如何存储来自Facebook、Twitter等的声明_C#_Facebook_Asp.net Identity - Fatal编程技术网

C# Asp.net web表单、Asp身份-如何存储来自Facebook、Twitter等的声明

C# Asp.net web表单、Asp身份-如何存储来自Facebook、Twitter等的声明,c#,facebook,asp.net-identity,C#,Facebook,Asp.net Identity,此请求基于Asp.net Identity stuff的新Visual Studio 2013集成。我已经看过一些关于MVC这个问题的帖子,但我一生都无法让它在标准Web表单上工作。我试图做的是从我从Facebook(或其他服务)获得的声明中填充AspNetUserClaims表。实际上,我可以看到下面经过身份验证的OnAuthenticated中返回的值,但我一辈子都不知道如何将这些声明添加到当前登录用户的上下文中 围绕这一点,实际上有数百个MVC示例,但遗憾的是,没有Web表单示例。这应该是

此请求基于Asp.net Identity stuff的新Visual Studio 2013集成。我已经看过一些关于MVC这个问题的帖子,但我一生都无法让它在标准Web表单上工作。我试图做的是从我从Facebook(或其他服务)获得的声明中填充AspNetUserClaims表。实际上,我可以看到下面经过身份验证的OnAuthenticated中返回的值,但我一辈子都不知道如何将这些声明添加到当前登录用户的上下文中

围绕这一点,实际上有数百个MVC示例,但遗憾的是,没有Web表单示例。这应该是非常简单的,但由于某些原因,我无法将当前登录用户的上下文与从Facebook返回的声明和凭据相匹配

当前,在OnAuthenticated激发之后,它显然会将我返回到内置示例提供的页面(registerexternalogin.aspx)。然而,这些声明已经不存在了,登录Facebook的上下文也不存在了,我现在不能做任何其他事情

因此,最终的问题是,在不使用MVC的情况下,如何基于当前登录用户的上下文将Facebook的声明填充到AspNetUserClaims表中

        var fboptions = new FacebookAuthenticationOptions();
        fboptions.AppId = "xxxxxxxxxxxxxxxxxxx";
        fboptions.AppSecret = "yyyyyyyyyyyyyyyyyyyyyy";
        fboptions.Scope.Add("email");
        fboptions.Scope.Add("friends_about_me");
        fboptions.Scope.Add("friends_photos");

        fboptions.Provider = new FacebookAuthenticationProvider()
        {
            OnAuthenticated = (context) =>
            {
                foreach (var v in context.User)
                {
                    context.Identity.AddClaim(new System.Security.Claims.Claim(v.Key, v.Value.ToString()));
                }
                context.Identity.AddClaim(new System.Security.Claims.Claim("FacebookAccessToken", context.AccessToken));
                return Task.FromResult(0);
            },
        };
        app.UseFacebookAuthentication(fboptions);

好的,我知道你说你想知道没有MVC怎么办,虽然我不能直接回答,但我可以告诉你,我和MVC有类似的问题,我是如何解决的。希望这能在Web表单中为您指明正确的方向

关键位如下所示:

使用外部提供程序登录后,系统将引导您进入一个页面,在该页面上注册新用户。发回之后,我不得不添加一行内容,首先再次获取索赔:

ClaimsIdentity claimsIdentity =
            await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);
如果没有打电话到上面这条线,它对我根本不起作用,所以也许这就是你的问题所在

一旦我有了ClaimSideEntity,您就可以遍历身份的claims属性上的声明集合。这应该包括您在OnAuthenticated回调委托中添加的Facebook令牌。然后,您只需调用UserManager.addClaimesync()将其添加到索赔数据库表中

有关更多信息,请访问我的AccountController类

具体看一下ExternalLoginConfirmation方法(ExternalLoginConfirmationViewModel模型,字符串returnUrl)和对StoreAuthTokenClaims()的调用,当然还有我在StoreAuthTokenClaims()中遵循的过程

希望这能在WebForms中对您有所帮助