Files
Web_CRICS_Server_VS2010_Prod/WebSite/Controllers/Oauth2Controller.cs
2025-12-11 09:17:16 +08:00

253 lines
12 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Data;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Dynamic;
using Common;
using Service;
namespace WebSite.Controllers
{
public class Oauth2Controller : BaseController
{
private static log4net.ILog logger = log4net.LogManager.GetLogger(typeof(Oauth2Controller));
private static string _clientID = System.Configuration.ConfigurationManager.AppSettings["rokid_client_id"];
private static string _clientSecret = System.Configuration.ConfigurationManager.AppSettings["rokid_client_secret"];
private static int _expiresIn = 180000;//50个小时
public ISysUserManager SysUserManager { get; set; }
public ISysOauth2Manager SysOauth2Manager { get; set; }
public ActionResult Index()
{
return View();
}
public ActionResult Authorize()
{
logger.Error("收到调用Authorize方法Url" + Request.Url);
try
{
if (Request.QueryString["response_type"] != "code")//固定code
{
return returnResult("response_type验证失败");
}
string client_id = Request.QueryString["client_id"];//若琪所使用的标识
string redirect_uri = Request.QueryString["redirect_uri"];//回调地址
string state = Request.QueryString["state"];//用来保持授权请求和授权回调状态的值,当授权完成后需要将这个参数附加在回调里。
//string scope = Request.QueryString["scope"];//授权的范围
if (client_id != _clientID)
{
logger.Error("client_id验证失败:" + client_id);
return returnResult("client_id验证失败");
}
if (string.IsNullOrEmpty(redirect_uri))
{
logger.Error("redirect_uri无效:" + redirect_uri);
return returnResult("redirect_uri无效");
}
if (redirect_uri.IndexOf("lzos.lunzn.com") > -1)//岚正播放盒免登录授权
{
string code = "1001BLW" + redirect_uri.Substring(redirect_uri.LastIndexOf("/") + 1);
var sysOahth2 = SysOauth2Manager.Get(code);
if (null == sysOahth2)
{
SysOauth2Manager.Save(new Domain.SysOauth2() { Code = code, RedirectUri = redirect_uri, ExpiresIn = _expiresIn, CreatedDate = DateTime.Now, Account = "system" });
}
return Redirect(redirect_uri + "?code=" + code + "&state=" + state);
}
else
{
ViewData["client_id"] = client_id;
ViewData["redirect_uri"] = redirect_uri;
ViewData["state"] = state;
return View();
}
}
catch (Exception ex)
{
logger.Error(ex);
return returnResult("授权失败:" + ex.Message);
}
}
public ActionResult LoginOn(string jsonData)
{
try
{
JObject jData = (JObject)JsonConvert.DeserializeObject(jsonData);
string account = jData["account"].ToString();
string password = jData["password"].ToString();
string redirect_uri = jData["redirect_uri"].ToString();
var entity = SysUserManager.Get(account, password);
if (entity == null)
{
return Json(new { IsSuccess = false, Message = HttpContext.InnerLanguage("UsernameOrPasswordWrong") });
}
if (!entity.ActiveIndicator)
{
return Json(new { IsSuccess = false, Message = HttpContext.InnerLanguage("YourAccountHasBeenDisabledPleaseContactTheAdministrator") });
}
string code = entity.Hotels[0].Code + "BLW" + redirect_uri.Substring(redirect_uri.LastIndexOf("/") + 1);
var sysOauth2 = SysOauth2Manager.Get(code);
if (null == sysOauth2)
{
SysOauth2Manager.Save(new Domain.SysOauth2() { Code = code, RedirectUri = redirect_uri, ExpiresIn = _expiresIn, CreatedDate = DateTime.Now, Account = account });
}
redirect_uri = System.Web.HttpUtility.UrlDecode(redirect_uri, System.Text.Encoding.UTF8) + "?code=" + code + "&state=" + jData["state"].ToString();
return Json(new { IsSuccess = true, Message = redirect_uri });
}
catch (Exception ex)
{
logger.Error(ex);
return returnResult("授权失败:" + ex.Message);
}
}
public ActionResult Token()
{
Request.InputStream.Position = 0;
byte[] reqBody = new byte[Request.InputStream.Length];
Request.InputStream.Read(reqBody, 0, reqBody.Length);
string reqData = System.Text.Encoding.UTF8.GetString(reqBody);
//logger.Error("收到调用Token方法参数值" + reqData);
try
{
string grant_type = "";//Request.QueryString["grant_type"];//必须,值为 authorization_code如果是刷新 Token 则为 refresh_token
string code = "";//Request.QueryString["code"];//如果是通过 authorization_code 获取 access token 则为必须,授权过程中颁发的授权代码
string client_id = "";//Request.QueryString["client_id"];//必须,若琪所使用的标识
string client_secret = "";//Request.QueryString["client_secret"];//可选,如果使用 HTTP Basic Auth 则该参数会包含在 HTTP Authorization Header 中
string refresh_token = "";
string[] queryStrings = reqData.Split('&');
foreach (string queryString in queryStrings)
{
string[] querys = queryString.Split('=');
switch (querys[0])
{
case "client_id":
client_id = querys[1];
break;
case "client_secret":
client_secret = querys[1];
break;
case "grant_type":
grant_type = querys[1];
break;
case "code":
code = querys[1];
break;
case "refresh_token":
refresh_token = querys[1];
break;
}
}
if (string.IsNullOrEmpty(client_id))//获取岚正播放盒调用参数
{
JObject jData = (JObject)JsonConvert.DeserializeObject(reqData);
client_id = jData["client_id"].ToString();
client_secret = jData["client_secret"].ToString();
grant_type = jData["grant_type"].ToString();
code = jData["code"].ToString();
refresh_token = jData["refresh_token"] == null ? "" : jData["refresh_token"].ToString();
}
if (client_id != _clientID)
{
logger.Error("client_id验证失败:" + client_id);
return returnResult("client_id验证失败");
}
if (client_secret != _clientSecret)
{
logger.Error("client_secret验证失败:" + client_secret);
return returnResult("client_secret验证失败");
}
Domain.SysOauth2 sysOauth2 = null;
switch (grant_type)
{
case "client_credentials"://客户端凭证授权模式
code = "1001BLWXiaoDu";//1001BLWXiaoMi
sysOauth2 = SysOauth2Manager.Get(code);
if (null == sysOauth2)
{
sysOauth2 = new Domain.SysOauth2()
{
Code = code,
RedirectUri = "",
ExpiresIn = _expiresIn,
CreatedDate = DateTime.Now,
Account = "system",
AccessToken = code.Substring(0, code.IndexOf("BLW") + 3) + Guid.NewGuid(),
RefreshToken = code.Substring(0, code.IndexOf("BLW") + 3) + Guid.NewGuid()
};
SysOauth2Manager.Save(sysOauth2);
}
else
{
sysOauth2.ExpiresIn = _expiresIn;
sysOauth2.CreatedDate = DateTime.Now;
SysOauth2Manager.Update(sysOauth2);//更新保存token
}
return Json(sysOauth2.AccessToken, JsonRequestBehavior.AllowGet);
case "refresh_token":
sysOauth2 = SysOauth2Manager.GetByRefreshToken(refresh_token);
break;
default:
sysOauth2 = SysOauth2Manager.Get(code);
sysOauth2.AccessToken = sysOauth2.Code.Substring(0, sysOauth2.Code.IndexOf("BLW") + 3) + Guid.NewGuid();//获取新的token
sysOauth2.RefreshToken = sysOauth2.Code.Substring(0, sysOauth2.Code.IndexOf("BLW") + 3) + Guid.NewGuid();//获取新的token
break;
}
if (null == sysOauth2)
{
logger.Error(string.Format("code或refresh_token验证失败,code:{0},refresh_token:{1}, 收到调用参数:{2}, 来自:{3}", code, refresh_token, reqData, Tools.GetClientIP()));
return returnResult("code或refresh_token验证失败");
}
sysOauth2.ExpiresIn = _expiresIn;
sysOauth2.CreatedDate = DateTime.Now;
SysOauth2Manager.Update(sysOauth2);//更新保存token
AuthorizeResult result = new AuthorizeResult
{
access_token = sysOauth2.AccessToken,
expires_in = sysOauth2.ExpiresIn,
refresh_token = sysOauth2.RefreshToken,
example_parameter = "example_value"
};
return Json(result, JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
logger.Error(ex);
return returnResult("授权失败:" + ex.Message);
}
}
private ActionResult returnResult(string message)
{
return Json(new { IsSuccess = false, Message = message }, JsonRequestBehavior.AllowGet);
}
}
public class AuthorizeResult
{
/// <summary>
/// 必须,由授权服务颁发的 access token
/// </summary>
public string access_token { get; set; }
/// <summary>
/// 可选AccessToken 的寿命,以秒为单位,如果 access_token 会过期则应该必须提供
/// </summary>
public int expires_in { get; set; }
/// <summary>
/// 可选,用来通过以 refresh_token 的 grant_type 请求 AccessToken 接口获取新的 AccessToken 的 token
/// </summary>
public string refresh_token { get; set; }
/// <summary>
/// example_value
/// </summary>
public string example_parameter { get; set; }
}
}