Owin OAuth提供商Twitter和微软

时间:2017-07-17 08:40:07

标签: twitter oauth owin

我遇到问题,以下行为twitter和microsoft返回null:

var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();

这是在帐户控制器中,如下所示:

[AllowAnonymous]
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
    var loginInfo = await 
    AuthenticationManager.GetExternalLoginInfoAsync();

    if (loginInfo == null)
    {
        return RedirectToAction("Login");
    }

    var result = await SignInManager.ExternalSignInAsync(loginInfo, false);
    switch (result)
    {
        case SignInStatus.Success:
            return RedirectToLocal(returnUrl);
        case SignInStatus.LockedOut:
            return View("Lockout");
        //case SignInStatus.RequiresVerification:
        //    return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = false });
        case SignInStatus.Failure:
        default:
            // If the user does not have an account, then prompt the user to create an account
            ViewBag.ReturnUrl = returnUrl;
            ViewBag.LoginProvider = loginInfo.Login.LoginProvider;
            return View("ExternalLoginConfirmation", new AccountExternalLoginConfirmationViewModel { Email = loginInfo.Email });
    }
}

在startup.auth.cs中,当前配置为:

app.UseTwitterAuthentication(
    new TwitterAuthenticationOptions()
    {
        ConsumerKey = ConfigurationManager.AppSettings["TwitterAPIKey"],
        ConsumerSecret = ConfigurationManager.AppSettings["TwitterAPISecret"],

        Provider = new TwitterAuthenticationProvider()
        {
            OnAuthenticated = context =>
            {
                context.Identity.AddClaim(new Claim("urn:tokens:twitter:accesstoken", context.AccessToken));
                context.Identity.AddClaim(new Claim("urn:tokens:twitter:accesstokensecret",
                    context.AccessTokenSecret));
                return Task.FromResult(true);
            }
        }
    });

       app.UseMicrosoftAccountAuthentication(new MicrosoftAccountAuthenticationOptions()
        {
           ClientId = ConfigurationManager.AppSettings["MicrosoftAPIKey"],
           ClientSecret = ConfigurationManager.AppSettings["MicrosoftAPISecret"],
           // Scope = { "wl.basic", "wl.emails" },
            Provider = new MicrosoftAccountAuthenticationProvider()
           {
               OnAuthenticated = context =>
               {
                   context.Identity.AddClaim(new Claim("urn:microsoftaccount:access_token", context.AccessToken, "Microsoft"));
                   context.Identity.AddClaim(new Claim("urn:microsoft:email", context.Email));
                   return Task.FromResult(true);
               }
           }
        });

有人建议在MicrosoftAccountAuthenticationOptions中包含Scope = {“wl.basic”,“wl.emails”}。但是这会返回错误的请求。有关使用twitter和microsoft登录解决此问题的方法的任何想法。

我用于微软的网址是 重定向网址:https://localhost/signin-microsoft 退出网址:https://localhost/account/logout 主页:https://localhost

微博 网站:https://127.0.0.1 回电话:https://127.0.0.1/signin-twitter

我已尝试使用实时网址,但仍然无效 var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync();

1 个答案:

答案 0 :(得分:0)

试试这个:

var options = new TwitterAuthenticationOptions { SignInAsAuthenticationType = signInAsType, ConsumerKey = "...", ConsumerSecret = "...", Provider = new TwitterAuthenticationProvider() { OnAuthenticated = async ctx => { var manager = new OAuth.Manager( "-your-twitter-access-token-", "-your-twitter-access-token-secret-", ctx.AccessToken, ctx.AccessTokenSecret); var url = "https://api.twitter.com/1.1/account/verify_credentials.json"; var authzHeader = manager.GenerateAuthzHeader(url, "GET"); var request = (HttpWebRequest)WebRequest.Create(url); request.Method = "GET"; request.PreAuthenticate = true; request.AllowWriteStreamBuffering = true; request.Headers.Add("Authorization", authzHeader); using (var response = (HttpWebResponse)request.GetResponse()) { if (response.StatusCode != HttpStatusCode.OK) throw new Exception("NOK"); var responseStream = response.GetResponseStream(); var reader = new System.IO.StreamReader(responseStream); var res = reader.ReadToEnd(); Newtonsoft.Json.Linq.JObject data = (Newtonsoft.Json.Linq.JObject)JsonConvert.DeserializeObject(res); var claims = new List<Claim>(); claims.Add(new Claim(Core.Constants.ClaimTypes.RawData, ctx.Identity.Claims.ToJsonString())); claims.Add(new Claim(Core.Constants.ClaimTypes.AccessToken, ctx.AccessToken)); claims.Add(new Claim(Core.Constants.ClaimTypes.AccessTokenSecret, ctx.AccessTokenSecret)); claims.Add(new Claim(Core.Constants.ClaimTypes.Subject, ctx.UserId)); claims.Add(new Claim(Core.Constants.ClaimTypes.Name, data["name"].TokenString())); claims.Add(new Claim(Core.Constants.ClaimTypes.Locale, GenerateLocale(data["lang"].TokenString()))); claims.Add(new Claim(Core.Constants.ClaimTypes.ZoneInfo, GenerateZone(data["location"].TokenString(), data["time_zone"].TokenString()))); claims.Add(new Claim(Core.Constants.ClaimTypes.WebSite, data["url"].TokenString())); claims.Add(new Claim(Core.Constants.ClaimTypes.ProfileUrl, "https://twitter.com/" + ctx.ScreenName)); claims.Add(new Claim(Core.Constants.ClaimTypes.Picture, data["profile_image_url"].TokenString())); await PrepClaims(ctx.Identity, claims); } } }