簡體   English   中英

在外部登錄/注冊ASP.NET Web API 2.0和Identity期間從Facebook檢索其他配置文件信息

[英]Retrieving additional profile information from Facebook during external login/register with ASP.NET Web API 2.0 and Identity

關於如何使用ASP.NET Identity和MVC客戶端從Facebook配置文件中獲取更多信息的文檔似乎很多,但是我似乎找不到關於如何從Web API控制器訪問附加信息聲明的任何信息。 。

我的Startup.Auth.cs ConfigAuth方法包含此內容,如果我在JObject WholeUser = context.User上設置斷點,該方法似乎可以正常工作

String XmlSchemaString = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims";
var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions()
{
    AppId = "*",
    AppSecret = "*",
    Provider = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationProvider()
    {
        OnAuthenticated = (context) =>
        {
            JObject wholeUser = context.User;

            context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:access_token", context.AccessToken, XmlSchemaString, "Facebook"));
            context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:email", context.Email, XmlSchemaString, "Facebook"));
            return Task.FromResult(0);
        }
    }
};
facebookOptions.Scope.Add("email");
app.UseFacebookAuthentication(facebookOptions);

一旦通過身份驗證,wholeUser將擁有我需要的所有信息,例如出生日期等,但是一旦超出此范圍,我將不知道該如何獲得它。

我需要在AccountController.RegisterExternal中獲取此信息,但似乎無法正確配置它。 許多MVC doco在ExternalLoginCallback方法中使用此方法:

ClaimsIdentity claimsIdentity = await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ExternalCookie);

但是在Web API中找不到AuthenticationManager,因此,如果將其更改為Authentication,除非將參數更改為DefaultAuthenticationTypes.ExternalBearer,否則它將返回null。 這與我所獲得的差不多,但是返回的ClaimsIdentity對象沒有任何其他聲明-僅用戶名和ID。

總體而言,好像我是從Facebook正確獲取信息並將其塞入上下文一樣,但后來我不知道如何從控制器訪問信息。 注意:ConfigAuth中的上下文對象的類型為Microsoft.Owin.Security.Facebook.FacebookAuthenticatedContext

我不確定您是否需要與我做的相同的事情,但是請看一下http://aliu.ro/easy-mvc4-facebook-authentication-example/

有一個小示例項目可以進行Facebook身份驗證,檢索訪問令牌並使用我在NuGet中找到的某些.NET SDK進行調用

我在這里使用了以下代碼;

            var facebookOptions = new Microsoft.Owin.Security.Facebook.FacebookAuthenticationOptions
        {
            AppId = "*",
            AppSecret = "**",
            Provider = new FacebookAuthenticationProvider()
            {
                OnAuthenticated = (context) =>
                {
                    context.Identity.AddClaim(new System.Security.Claims.Claim("urn:facebook:access_token", context.AccessToken, ClaimValueTypes.String, "Facebook"));

                    return Task.FromResult(0);
                }
            },
        };
        facebookOptions.Scope.Add("email");
        app.UseFacebookAuthentication(facebookOptions);

現在,在RegisterExternal方法中,該索賠對我可用。 我只是不知道如何將其持久保存在身份中,以便可以在其他Controller調用中使用它。 如果我將聲明添加到身份中,則似乎在其他調用上打破了User.Identity對象;

ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity);

還有FromIdentity方法;

            public static ExternalLoginData FromIdentity(ClaimsIdentity identity)
        {
            if (identity == null)
            {
                return null;
            }
            string userEmail = string.Empty;
            string userFacebookAccessToken = string.Empty;

            Claim providerKeyClaim = identity.FindFirst(ClaimTypes.NameIdentifier);
            Claim facebookToken = identity.Claims.First(x => x.Type.Contains("access_token"));
            Claim emailDetails = identity.FindFirst(ClaimTypes.Email);

            if (facebookToken != null) userFacebookAccessToken = facebookToken.Value;
            if (emailDetails != null)  userEmail = emailDetails.Value;
            //string userEmail = identity.Claims.First(x => x.Type.Contains("emailaddress")).Value;

            if (providerKeyClaim == null || String.IsNullOrEmpty(providerKeyClaim.Issuer)
                || String.IsNullOrEmpty(providerKeyClaim.Value))
            {
                return null;
            }

            if (providerKeyClaim.Issuer == ClaimsIdentity.DefaultIssuer)
            {
                return null;
            }

            return new ExternalLoginData
            {
                LoginProvider = providerKeyClaim.Issuer,
                ProviderKey = providerKeyClaim.Value,
                UserName = identity.FindFirstValue(ClaimTypes.Name),
                Email = userEmail,
                FacebookAccessToken = userFacebookAccessToken

            };
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM