OAuth的MVC实现(微软)

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

  

原文地址:https://www.cnblogs.com/panpanwelcome/p/7682832.html