LoginController中:
第三方登陆
???????public ActionResult LogOn() ???????{ ???????????string liveUrl = ???????????????string.Format( ???????????????????"https://login.live.com/oauth20_authorize.srf?client_id={0}&scope=wl.Emails&response_type=code&redirect_uri={1}&locale={2}", ???????????????????this.ClientId, ???????????????????this.OAuthLogOnCallbackUrl, ???????????????????this.Locale); ???????????return this.Redirect(liveUrl); ???????}
登陆成功,获取授权
???????public async Task<ActionResult> LogOnCallback() ???????{ ???????????string code = this.Request.QueryString["code"]; ???????????if (string.IsNullOrEmpty(code)) ???????????????return RedirectToAction("Index", "Login"); ???????????string tokenUrl = ???????????????string.Format( ???????????????????"https://login.live.com/oauth20_token.srf?client_id={0}&redirect_uri={1}&client_secret={2}&code={3}&grant_type=authorization_code&locale={4}", ???????????????????this.ClientId, ???????????????????this.OAuthLogOnCallbackUrl, ???????????????????this.ClientSecret, ???????????????????code, ???????????????????this.Locale); ???????????string liveId = string.Empty; ???????????try ???????????{ ???????????????liveId = await RequestLiveIdByToken(await RequestToken(tokenUrl)); ???????????} ???????????catch (Exception e) ???????????{ ???????????????_logger.Fatal("无法获取LiveId Token", e); ???????????????var result = new ViewModels.LoginResult ???????????????{ ???????????????????Success = false, ???????????????????ErrorMessage = "无法连接登录服务,请稍后再试。" ???????????????}; ???????????????return View("Index", result); ???????????} ???????????if (!string.IsNullOrEmpty(liveId)) ???????????{ ???????????????var userSvc = _userSvc; ???????????????if (userSvc.CurrentUser == null) ???????????????{ ???????????????????UserInfo user = userSvc.GetUserByEmail(liveId); ???????????????????if (user != null && user.IsEnable) ???????????????????{ ???????????????????????return this.DoLogin(user); ???????????????????} ???????????????????else ???????????????????{ ???????????????????????var result = new ViewModels.LoginResult ???????????????????????{ ???????????????????????????Success = false ???????????????????????}; ???????????????????????if (user != null && !user.IsEnable) ???????????????????????{ ???????????????????????????result.ErrorMessage = "用户被禁止登录!"; ???????????????????????} ???????????????????????else ???????????????????????{ ???????????????????????????result.ErrorMessage = "用户不存在!"; ???????????????????????} ???????????????????????return View("Index", result); ???????????????????} ???????????????} ???????????????return this.DoLogin(userSvc.CurrentUser); ???????????} ???????????return this.RedirectToAction("Index", "Login"); ???????} ???
???????[NonAction] ???????private async Task<string> RequestToken(string url) ???????{ ???????????var request = WebRequest.Create(url); ???????????using (var response = await request.GetResponseAsync()) ???????????{ ???????????????using (var sr = new StreamReader(response.GetResponseStream())) ???????????????{ ???????????????????var json = sr.ReadToEnd(); ???????????????????return JsonConvert.DeserializeAnonymousType(json, new { access_token = "" }).access_token; ???????????????} ???????????} ???????} ???????[NonAction] ???????private async Task<string> RequestLiveIdByToken(string token) ???????{ ???????????if (string.IsNullOrEmpty(token)) ???????????????return string.Empty; ???????????var request = WebRequest.Create(string.Format("https://apis.live.net/v5.0/me?access_token={0}", token)); ???????????using (var response = await request.GetResponseAsync()) ???????????{ ???????????????using (var sr = new StreamReader(response.GetResponseStream())) ???????????????{ ???????????????????string json = sr.ReadToEnd(); ???????????????????var userJson = JsonConvert.DeserializeAnonymousType(json, new { emails = new { account = "" } }); ???????????????????return userJson.emails.account; ???????????????} ???????????} ???????}
注销登陆
???????public ActionResult LogOff() ???????{ ???????????this.PreLogout(); ???????????string liveUrl = ???????????????string.Format( ???????????????????"https://login.live.com/oauth20_logout.srf?client_id={0}&scope=wl.Emails&response_type=code&redirect_uri={1}&locale={2}", ???????????????????this.ClientId, ???????????????????this.OAuthLogOnCallbackUrl, ???????????????????this.Locale); ???????????return this.Redirect(liveUrl); ???????}
OAuth的MVC实现(微软)
原文地址:http://www.cnblogs.com/panpanwelcome/p/7682832.html