253 lines
12 KiB
C#
253 lines
12 KiB
C#
|
|
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; }
|
|||
|
|
}
|
|||
|
|
}
|