分类

链接

2018 年 3 月
 1234
567891011
12131415161718
19202122232425
262728293031  

近期文章

热门标签

新人福利,免费薅羊毛

现在位置:    首页 > .NET > 正文
共享办公室出租
asp.net mvc auth2.0简化版——服务端
.NET 暂无评论 阅读(523)
  1.  public class AuthController : Controller
  2.     {
  3.         private static readonly List<string> client_id_list = new List<string>() { "123456789" };
  4.         private static readonly List<string> response_type_list = new List<string>() { "code" };
  5.         private static readonly List<UserInfo> user_list = new List<UserInfo>();
  6.         private static readonly List<UserCode> user_code_list = new List<UserCode>();
  7.         private static readonly List<UserToken> user_token_list = new List<UserToken>();
  8.  
  9.         public AuthController()
  10.         {
  11.  
  12.             user_list.Add(new Models.UserInfo("admin", "admin", 33, "male"));
  13.             user_list.Add(new Models.UserInfo("test", "tgest", 22, "female"));
  14.  
  15.         }
  16.  
  17.  
  18.         [HttpGet]
  19.         public ActionResult Authorize()
  20.         {
  21.             return View();
  22.         }
  23.  
  24.         [HttpPost]
  25.         public ActionResult SubmitAuthorize()
  26.         {
  27.             return View();
  28.         }
  29.  
  30.         public ActionResult Error()
  31.         {
  32.             return View();
  33.         }
  34.  
  35.         [HttpGet]
  36.         public ActionResult Login()
  37.         {
  38.             return View();
  39.         }
  40.  
  41.         [HttpPost]
  42.         public ActionResult Login(UserInfo userinfo)
  43.         {
  44.             var username = userinfo.UserName;
  45.             var password = userinfo.Password;
  46.  
  47.             //取得重定向的信息
  48.             var redirect_uri = Session["redirect_uri"] ?? "";
  49.             var state = Session["state"] ?? "";
  50.             string code = Guid.NewGuid().ToString();
  51.  
  52.             //验证用户名密码
  53.             if (user_list.Count(=> f.UserName == username >> f.Password == password) == 0)
  54.                 return this.Json("用户名或密码不正确", JsonRequestBehavior.AllowGet);
  55.  
  56.             //保存code到DB/Redis,默认存在30秒
  57.             user_code_list.Add(new UserCode() { UserName = username, Code = code, ExpiryDate = DateTime.Now.AddSeconds(30) });
  58.  
  59.             //绑定code与userid,因为后面查询用户信息的时候要用到,默认存在30秒
  60.             //_oAuth2ServerServices.BingCodeAndUser(username, code);
  61.             //重定向
  62.  
  63.             string url = string.Format(HttpUtility.UrlDecode(redirect_uri.ToString()) + "?code={0}&state={1}", code, state);
  64.  
  65.             Response.Redirect(url);
  66.  
  67.             return null;
  68.  
  69.             //return View();
  70.         }
  71.  
  72.  
  73.         //
  74.         // GET: /Authorize/
  75.  
  76.         public ActionResult Index(string client_id, string response_type, string redirect_uri, string scope, string state = "")
  77.         {
  78.             if (!client_id_list.Contains(client_id))
  79.             {
  80.                 return this.Json(new { msg = "client_id error", code = "-1" }, JsonRequestBehavior.AllowGet);
  81.             }
  82.  
  83.             if (!response_type_list.Contains(response_type))
  84.             {
  85.                 return this.Json(new { msg = "response_type error", code = "-1" }, JsonRequestBehavior.AllowGet);
  86.             }
  87.  
  88.  
  89.  
  90.             //保存用户请求的所有信息到指定容器(session)
  91.             Session.Add("client_id", client_id);
  92.             Session.Add("response_type", response_type);
  93.             Session.Add("redirect_uri", redirect_uri);
  94.             Session.Add("state", state);
  95.             Session.Add("scope", scope);
  96.  
  97.             Redirect("/Auth/Login?client_id=" + client_id + "&redirect_uri=" + HttpUtility.UrlEncode(redirect_uri) + "&response_type=" + response_type);
  98.  
  99.             //重定向到用户授权页面(当然你可以自定义自己的页面)
  100.             return View("Login");
  101.  
  102.  
  103.         }
  104.  
  105.  
  106.  
  107.         // <summary>
  108.         /// 获取或刷新token。
  109.         /// token可能保存在DB/Redis等
  110.         /// </summary>
  111.         /// <param name="code"></param>
  112.         /// <param name="grant_type"></param>
  113.         /// <param name="client_id"></param>
  114.         /// <param name="client_secret"></param>
  115.         /// <returns></returns>
  116.         public ActionResult Token(string code, string grant_type, string client_id)
  117.         {
  118.             Response.ContentType = "application/json";
  119.             Response.AddHeader("Cache-Control", "no-store");
  120.  
  121.             //获取token
  122.             if (grant_type == "authorization_code")
  123.             {
  124.                 //判断code是否过期
  125.                 if (!user_code_list.Exists(=> f.Code == code >> f.ExpiryDate > DateTime.Now))
  126.                 {
  127.                     return this.Json("code 不存在或已过期", JsonRequestBehavior.AllowGet);
  128.                 }
  129.  
  130.                 //判断client_id与client_secret是否正确
  131.                 if (!client_id_list.Contains(client_id))
  132.                 {
  133.                     return this.Json("client_id不正确", JsonRequestBehavior.AllowGet);
  134.                 }
  135.  
  136.                 //通过code获取userid,然后用token与userid做绑定,最后把code设置成消失(删除)
  137.                 var user_code = user_code_list.FirstOrDefault(=> f.Code == code);
  138.                 if (user_code == null)
  139.                 {
  140.                     return this.Json("code不存在或已过期", JsonRequestBehavior.AllowGet);
  141.                 }
  142.  
  143.                 //username
  144.                 string username = user_code.UserName;
  145.  
  146.                 //新建token
  147.                 string access_token = Guid.NewGuid().ToString();
  148.  
  149.                 //保存token,默认是30分钟
  150.                 user_token_list.Add(new UserToken() { UserName = username, Code = code, ExpiryDate = DateTime.Now.AddMinutes(30), Token = access_token });
  151.  
  152.                 //删除code
  153.                 user_code_list.RemoveAll(=> f.Code == code);
  154.  
  155.                 //返回token
  156.                 return this.Json(access_token, JsonRequestBehavior.AllowGet);
  157.             }
  158.  
  159.             //刷新token
  160.             else if (grant_type == "refresh_token")
  161.             {
  162.                 //新建token
  163.                 string new_access_token = Guid.NewGuid().ToString();
  164.  
  165.                 //替换保存新的token,默认是30分钟
  166.                 var user_token = user_token_list.FirstOrDefault(=> f.Code == code);
  167.                 user_token.Token = new_access_token;
  168.                 user_token.ExpiryDate = DateTime.Now.AddMinutes(30);
  169.  
  170.                 //返回新建的token
  171.                 return this.Json(new_access_token, JsonRequestBehavior.AllowGet);
  172.             }
  173.  
  174.             return this.Json("error grant_type=" + grant_type, JsonRequestBehavior.AllowGet);
  175.         }
  176.  
  177.  
  178.  
  179.         /// <summary>
  180.         /// 通过token获取用户信息
  181.         /// </summary>
  182.         /// <param name="oauth_token"></param>
  183.         /// <returns></returns>
  184.         public ActionResult UserInfo(string token)
  185.         {
  186.             var user_token = user_token_list.FirstOrDefault(=> f.Token == token);
  187.             if (user_token == null || user_token.ExpiryDate < DateTime.Now)
  188.             {
  189.                 return this.Json("token无效", JsonRequestBehavior.AllowGet);
  190.             }
  191.  
  192.             UserInfo u = user_list.FirstOrDefault(=> f.UserName == user_token.UserName);
  193.  
  194.             return this.Json(u, JsonRequestBehavior.AllowGet);
  195.         }

============ 欢迎各位老板打赏~ ===========

本文版权归Bruce's Blog所有,转载引用请完整注明以下信息:
本文作者:Bruce
本文地址:asp.net mvc auth2.0简化版——服务端 | Bruce's Blog

发表评论

留言无头像?