Owin OAuth提供商Twitter和Microsoft

Owin OAuth提供商Twitter和Microsoft,twitter,oauth,owin,Twitter,Oauth,Owin,我对以下行在twitter和microsoft中返回null存在问题: var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); 这在帐户控制器中,如下所示: [AllowAnonymous] public async Task<ActionResult> ExternalLoginCallback(string returnUrl) { var loginInfo = await

我对以下行在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 });
    }
}
有人建议在MicrosoftAccountAuthenticationOptions中包含Scope={“wl.basic”,“wl.emails”}。然而,这返回了一个错误的请求。关于如何通过twitter和microsoft登录解决此问题的任何想法

我为microsoft使用的URL是 重定向Url: 注销Url: 主页:

推特 网站: 回拨url:

我也尝试过在live上使用live URL,但在live上仍然是空的 var loginInfo=await AuthenticationManager.GetExternalLoginInfoAsync()

试试这个:

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); } } }

var options=新的TwitterAuthenticationOptions { SignInAsAuthenticationType=signInAsType, ConsumerKey=“…”, ConsumerCret=“…”, Provider=新的TwitterAuthenticationProvider() { OnAuthenticated=异步ctx=> { var manager=新的OAuth.manager( “-您的twitter访问令牌-”, “-您的twitter访问令牌密码-”, ctx.AccessToken, ctx.AccessTokenSecret); 变量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; 添加(“授权”,authzHeader); 使用(var response=(HttpWebResponse)request.GetResponse()) { if(response.StatusCode!=HttpStatusCode.OK) 抛出新异常(“NOK”); var responseStream=response.GetResponseStream(); 变量读取器=新系统.IO.StreamReader(responseStream); var res=reader.ReadToEnd(); Newtonsoft.Json.Linq.JObject数据=(Newtonsoft.Json.Linq.JObject)JsonConvert.DeserializeObject(res); var索赔=新列表(); 添加(新声明(Core.Constants.ClaimTypes.RawData,ctx.Identity.claims.ToJsonString()); 添加(新的声明(Core.Constants.ClaimTypes.AccessToken,ctx.AccessToken)); 添加(新声明(Core.Constants.ClaimTypes.AccessTokenSecret,ctx.AccessTokenSecret)); 添加(新声明(Core.Constants.ClaimTypes.Subject,ctx.UserId)); 添加(新声明(Core.Constants.ClaimTypes.Name,data[“Name”].TokenString()); 添加(新声明(Core.Constants.ClaimTypes.Locale,generateScale(data[“lang”].TokenString())); 添加(新声明(Core.Constants.ClaimTypes.ZoneInfo,GenerateZone(数据[“位置”].TokenString(),数据[“时区”].TokenString())); 添加(新声明(Core.Constants.ClaimTypes.WebSite,data[“url”].TokenString()); 添加(新声明(Core.Constants.ClaimTypes.ProfileUrl,)https://twitter.com/“+ctx.ScreenName”); 添加(新声明(Core.Constants.ClaimTypes.Picture,data[“profile\u image\u url”].TokenString()); 等待索赔(ctx.Identity,索赔); } } }
Hi,你找到解决这个问题的方法了吗?我也遇到了同样的问题,但我发现的方法都不管用。

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); } } }