c# - tutorial - mvc login page




Erhalten Sie die E-Mail-Adresse des Benutzers von der Twitter-API für die externe Anmeldeauthentifizierung. ASP.NET MVC C# (2)

Nachdem ich fast kahl geworden war und alle meine Haare aus meinem Kopf gezogen hatte, brachte ich es endlich zur Arbeit. Ich fand heraus, dass sich die Signature Base-Zeichenfolge etwas von der mit meinem Code erzeugten Signatur unterscheidet. Nach ein paar kleinen Änderungen konnte ich eine gültige Signatur-Basis-Zeichenfolge generieren.

In Startup.cs habe ich access_token und access_secret als Ansprüche hinzugefügt. Ich habe das in meiner App gefundene nicht verwendet, da die Benutzer beim Anmelden oder Registrieren einen neuen Benutzer aufrufen müssen:

var twitterOptions = new Microsoft.Owin.Security.Twitter.TwitterAuthenticationOptions()
{
   ConsumerKey = ConfigurationManager.AppSettings["consumer_key"],
   ConsumerSecret = ConfigurationManager.AppSettings["consumer_secret"],
   Provider = new Microsoft.Owin.Security.Twitter.TwitterAuthenticationProvider
   {
      OnAuthenticated = (context) =>
      {
         context.Identity.AddClaim(new System.Security.Claims.Claim("urn:twitter:access_token", context.AccessToken));
         context.Identity.AddClaim(new System.Security.Claims.Claim("urn:twitter:access_secret", context.AccessTokenSecret));
         return Task.FromResult(0);
      }
   },
   BackchannelCertificateValidator = new Microsoft.Owin.Security.CertificateSubjectKeyIdentifierValidator(new[]
   {
      "A5EF0B11CEC04103A34A659048B21CE0572D7D47", // VeriSign Class 3 Secure Server CA - G2
      "0D445C165344C1827E1D20AB25F40163D8BE79A5", // VeriSign Class 3 Secure Server CA - G3
      "7FD365A7C2DDECBBF03009F34339FA02AF333133", // VeriSign Class 3 Public Primary Certification Authority - G5
      "39A55D933676616E73A761DFA16A7E59CDE66FAD", // Symantec Class 3 Secure Server CA - G4
      "‎add53f6680fe66e383cbac3e60922e3b4c412bed", // Symantec Class 3 EV SSL CA - G3
      "4eb6d578499b1ccf5f581ead56be3d9b6744a5e5", // VeriSign Class 3 Primary CA - G5
      "5168FF90AF0207753CCCD9656462A212B859723B", // DigiCert SHA2 High Assurance Server C‎A 
      "B13EC36903F8BF4701D498261A0802EF63642BC3" // DigiCert High Assurance EV Root CA
    }),
    CallbackPath = new PathString("/twitter/account/ExternalLoginCallback")
};

 app.UseTwitterAuthentication(twitterOptions);

Und schließlich habe ich in meinem Controller gerade meine Helfer-Klasse angerufen, um den Namen und die E-Mail von Twitter zu erhalten:

    if (loginInfo.Login.LoginProvider.ToLower() == "twitter")
    {
        string access_token = loginInfo.ExternalIdentity.Claims.Where(x => x.Type == "urn:twitter:access_token").Select(x => x.Value).FirstOrDefault();
        string access_secret = loginInfo.ExternalIdentity.Claims.Where(x => x.Type == "urn:twitter:access_secret").Select(x => x.Value).FirstOrDefault();
        TwitterDto response = MyHelper.TwitterLogin(access_token, access_secret, ConfigurationManager.AppSettings["consumer_key"], ConfigurationManager.AppSettings["consumer_secret"]);
       // by now response.email should possess the email value you need
    }

Helper-Klassenmethode:

Dies war der Abschnitt, den ich optimiert habe, um eine gültige Anfrage zu machen:

baseString = string.Concat ("GET", Uri.EscapeDataString (resource_url) + "&" + Uri.EscapeDataString (request_query), "% 26", Uri.EscapeDataString (basisString));

public static TwitterDto TwitterLogin(string oauth_token, string oauth_token_secret, string oauth_consumer_key, string oauth_consumer_secret)
        {
            // oauth implementation details
            var oauth_version = "1.0";
            var oauth_signature_method = "HMAC-SHA1";

            // unique request details
            var oauth_nonce = Convert.ToBase64String(
                new ASCIIEncoding().GetBytes(DateTime.Now.Ticks.ToString()));
            var timeSpan = DateTime.UtcNow
                - new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
            var oauth_timestamp = Convert.ToInt64(timeSpan.TotalSeconds).ToString();

            var resource_url = "https://api.twitter.com/1.1/account/verify_credentials.json";
            var request_query = "include_email=true";
            // create oauth signature
            var baseFormat = "oauth_consumer_key={0}&oauth_nonce={1}&oauth_signature_method={2}" +
                            "&oauth_timestamp={3}&oauth_token={4}&oauth_version={5}";

            var baseString = string.Format(baseFormat,
                                        oauth_consumer_key,
                                        oauth_nonce,
                                        oauth_signature_method,
                                        oauth_timestamp,
                                        oauth_token,
                                        oauth_version
                                        );

            baseString = string.Concat("GET&", Uri.EscapeDataString(resource_url) + "&" + Uri.EscapeDataString(request_query), "%26", Uri.EscapeDataString(baseString));

            var compositeKey = string.Concat(Uri.EscapeDataString(oauth_consumer_secret),
                                    "&", Uri.EscapeDataString(oauth_token_secret));

            string oauth_signature;
            using (HMACSHA1 hasher = new HMACSHA1(ASCIIEncoding.ASCII.GetBytes(compositeKey)))
            {
                oauth_signature = Convert.ToBase64String(
                    hasher.ComputeHash(ASCIIEncoding.ASCII.GetBytes(baseString)));
            }

            // create the request header
            var headerFormat = "OAuth oauth_consumer_key=\"{0}\", oauth_nonce=\"{1}\", oauth_signature=\"{2}\", oauth_signature_method=\"{3}\", oauth_timestamp=\"{4}\", oauth_token=\"{5}\", oauth_version=\"{6}\"";

            var authHeader = string.Format(headerFormat,
                                    Uri.EscapeDataString(oauth_consumer_key),
                                    Uri.EscapeDataString(oauth_nonce),
                                    Uri.EscapeDataString(oauth_signature),
                                    Uri.EscapeDataString(oauth_signature_method),
                                    Uri.EscapeDataString(oauth_timestamp),
                                    Uri.EscapeDataString(oauth_token),
                                    Uri.EscapeDataString(oauth_version)
                            );


            // make the request

            ServicePointManager.Expect100Continue = false;
            resource_url += "?include_email=true";
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(resource_url);
            request.Headers.Add("Authorization", authHeader);
            request.Method = "GET";

            WebResponse response = request.GetResponse();
            return JsonConvert.DeserializeObject<TwitterDto>(new StreamReader(response.GetResponseStream()).ReadToEnd());
        }
    }

    public class TwitterDto
    {
        public string name { get; set; }
        public string email { get; set; }
    }

Das ist alles, was Sie brauchen, um die E-Mail des Twitter-Benutzers zu erhalten. Ich hoffe, es hilft jemandem, der damit zu kämpfen hat. Bitte beachten Sie, dass die in der Frage genannten Schritte auch sehr wichtig sind.

Ich habe ein paar verwandte Fragen überprüft, um eine Antwort auf meine Frage zu finden, aber alles ohne Erfolg. Diese Frage Können wir eine E-Mail-ID von Twitter oauth API erhalten? hat mich soweit gebracht, die Twitter-Unterstützung zu bekommen, um die Erlaubnis auf meiner App unten zu erlauben: Dieses Dokument als Leitfaden und den Code der markierten Antwort verwenden (etwas modifizieren)

var resource_url = "https://api.twitter.com/1.1/account/verify_credentials.json";
var postBody = "include_email=true";//
resource_url += "?" + postBody;

um eine Signatur zu generieren und eine Anfrage zu stellen, um die Benutzerdetails von Twitter-Ergebnissen zu erhalten 401 Nicht autorisiert in meiner MVC-App.

Wenn ich jedoch das Generierungswerkzeug für Twitter-Signaturen verwende, um den Berechtigungsheader zu generieren, und fiddler verwende, um eine GET-Anfrage an https://api.twitter.com/1.1/account/verify_credentials.json?include_email=true zu senden , erhalte ich die E-Mail nur einmal und ich muss meine App Keys in Twitter neu generieren, um es wieder zu bekommen.

Gibt es ein Dokument zum Generieren einer gültigen Signatur und eine gültige Anfrage zum Abrufen der Twitter-Benutzer-E-Mail über .Net TwitterAuthentication?


Sie müssen Ihren Code ändern, um die Methode GET account / verify_credentials aufzurufen, nachdem der Benutzer mit twitter angemeldet ist. Und es ist wichtig, den Parameter include_email auf "true" zu setzen. Wenn dies auf "Wahr" gesetzt ist, wird die E-Mail in den Benutzerobjekten als Zeichenfolge zurückgegeben. Ich benutze diese Bibliothek https://www.nuget.org/packages/linqtotwitter, damit ich keinen Code für die Bearbeitung von Twitter-API-Anfragen schreiben muss

var twitterCtx = new TwitterContext(authTwitter);
var verifyResponse = await
    (from acct in twitterCtx.Account
    where (acct.Type == AccountType.VerifyCredentials) && (acct.IncludeEmail == true)
    select acct)
    .SingleOrDefaultAsync();

Sehen Sie, wie ich das hier getan habe http://www.bigbrainintelligence.com/Post/get-users-email-address-from-twitter-oauth-ap

Es ist eine einfache und saubere Lösung







twitter-oauth