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

      

  • 相关阅读:
    转载 | CSS文本溢出显示省略号
    转载 | CSS书写顺序
    转载 | CSS布局大全
    threejs sprite 制作标签
    typeScript 中的类
    Es5中的类
    typeScript中的函数
    websocket在vue项目中的使用
    typeScript中的变量数据类型
    echarts 中的1/4圆环行图的使用
  • 原文地址:https://www.cnblogs.com/panpanwelcome/p/7682832.html
Copyright © 2020-2023  润新知