OAuth 2.0 C# 版
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http; namespace Service.Controllers
{
/// <summary>
/// 身份认证
/// </summary>
public class OAuthController : ApiController
{
#region 配置
//code有效时间/分钟
int codeValidTime = ;
//token有效时间/分钟
int accesstokenValidTime = ;
dynamic returnData = new ExpandoObject();
private OAuthController()
{
returnData.Massage = "";
returnData.Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
returnData.Note = "";
returnData.Status = ;
}
#endregion #region 授权码模式
/// <summary>
/// 1、【授权码模式】获取Code【有效时间:10min,获取令牌必备使用1次后失效】
/// </summary>
/// <param name="clientId">表示客户端的ID,必选项</param>
/// <param name="redirectUri">表示重定向URI,可选项</param>
/// <param name="scope">表示申请的权限范围,可选项</param>
/// <param name="state">表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值</param>
/// <returns>Code</returns>
public dynamic GetCode(string clientId, string state, string redirectUri = "", string scope = "")
{
string code = Guid.NewGuid().ToString("N");
returnData.Massage = code;
returnData.Note = state;
RedisCacheHelper.Add("GetCode"+ clientId, code, DateTime.Now.AddMinutes(codeValidTime));
if (!string.IsNullOrEmpty(redirectUri))
{
HttpContext.Current.Response.Redirect(redirectUri + "?code=" + code + "&state=" + state, true);
}
return returnData;
} /// <summary>
/// 2、【授权码模式】获取令牌【有效时间:1h,获取资源接口可重复使用】
/// </summary>
/// <param name="code">表示上一步获得的授权码,必选项</param>
/// <param name="state">表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值</param>
/// <param name="clientId">表示客户端ID,必选项</param>
/// <param name="redirectUri">表示重定向URI,必选项,且必须与A步骤中的该参数值保持一致</param>
/// <returns>AuthorizationCode</returns>
public dynamic GetAuthorizationCode(string code, string state, string clientId, string redirectUri = "")
{
string redisCode = RedisCacheHelper.Get<string>("GetCode" + clientId) ??"";
returnData.Note = state;
if (string.IsNullOrEmpty(redisCode))
{
returnData.Massage = "code过期";
return returnData;
}
if (!redisCode.Equals(code))
{
returnData.Massage = "code有误";
return returnData;
}
string accesstoken = Guid.NewGuid().ToString("N");
returnData.Massage = accesstoken;
RedisCacheHelper.Add("GetAuthorizationCode" + clientId, accesstoken, DateTime.Now.AddMinutes(accesstokenValidTime)); RedisCacheHelper.Remove("GetCode" + clientId);
if (!string.IsNullOrEmpty(redirectUri))
{
HttpContext.Current.Response.Redirect(redirectUri + "?code=" + code + "&state=" + state, true);
}
return returnData;
} /// <summary>
/// 3、验证令牌
/// </summary>
/// <param name="accessToken">令牌</param>
/// <param name="clientId">表示客户端ID,必选项</param>
/// <returns>Bool AuthorizationCode</returns>
public dynamic GetValidationAuthorization(string accessToken,string clientId)
{
string redisAccesstoken = RedisCacheHelper.Get<string>("GetAuthorizationCode" + clientId) ?? "";
if (accessToken.Equals(redisAccesstoken))
{
returnData.Massage = true;
return returnData;
}
else
{
returnData.Massage = false;
return returnData;
}
}
#endregion #region 简化模式
/// <summary>
/// 4、【简化模式】获取Token【有效时间:1h,获取资源接口可重复使用】
/// </summary>
/// <param name="clientId">表示客户端的ID,必选项</param>
/// <param name="redirectUri">表示重定向URI,可选项</param>
/// <param name="state">表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值</param>
/// <returns>Code</returns>
public dynamic GetToken(string clientId, string state, string redirectUri = "")
{
string token = Guid.NewGuid().ToString("N");
returnData.Massage = token;
returnData.Note = state;
RedisCacheHelper.Add("GetAuthorizationCode" + clientId, token, DateTime.Now.AddMinutes(accesstokenValidTime));
if (!string.IsNullOrEmpty(redirectUri))
{
HttpContext.Current.Response.Redirect(redirectUri + "?token=" + token + "&state=" + state, true);
}
return returnData;
} #endregion #region 密码模式
/// <summary>
/// 5、【密码模式】获取Token【有效时间:1h,获取资源接口可重复使用】
/// </summary>
/// <param name="userName">用户名</param>
/// <param name="passWord">密码</param>
/// <returns></returns>
public dynamic GetTokenByUser(string userName, string passWord)
{
int clientId = ;
if (userName == passWord)
clientId = ;
else
{
returnData.Massage = "用户名密码有误(Test相同即可)";
return returnData;
}
string token = Guid.NewGuid().ToString("N");
returnData.Massage = token;
RedisCacheHelper.Add("GetAuthorizationCode" + clientId, token, DateTime.Now.AddMinutes(accesstokenValidTime));
return returnData;
}
#endregion #region 客户端模式
/// <summary>
/// 6、【客户端模式】获取Token【有效时间:1h,获取资源接口可重复使用】
/// </summary>
/// <returns></returns>
public dynamic GetTokenByClient()
{
int clientId = ;
string token = Guid.NewGuid().ToString("N");
returnData.Massage = token;
RedisCacheHelper.Add("GetAuthorizationCode" + clientId, token, DateTime.Now.AddMinutes(accesstokenValidTime));
return returnData;
}
#endregion
}
}
OAuth 2.0 C# 版的更多相关文章
- IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API
IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...
- 理解OAuth 2.0
转自:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛 ...
- 理解OAuth 2.0(转载)
作者: 阮一峰 原文地址:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标 ...
- 用户授权 OAuth 2.0
什么是OAuth OAuth是一个关于授权(Authorization)的开放网络标准,目前的版本是2.0版.OAuth适用于各种各样的包括提供用户身份验证机制的应用程序,注意是Authorizati ...
- [转]理解OAuth 2.0
作者: 阮一峰 OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释, ...
- 理解OAuth 2.0[摘]
原文地址:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到 ...
- [转发] 理解 oauth 2.0
原文: http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html oauth 的各种编程语言实现: http://oauth.net/2/ 理解OAu ...
- 理解OAuth 2.0 -摘自网络
OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OA ...
- 【转载】理解OAuth 2.0
http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 作者: 阮一峰 日期: 2014年5月12日 OAuth是一个关于授权(authorizat ...
随机推荐
- spring aop简单理解
aop原理是spring帮我们封装了动态代理,然后我们只管写具体的业务,我们将公共业务也写到具体的一个类中并实现spring为我们提供的对应要连接切入哪个位置的接口,然后再xml中配置它们的关系即可. ...
- 洛谷.1782.旅行商的背包(背包DP 单调队列)
题目链接(卡常背包) 朴素的多重背包是: \(f[i][j] = \max\{ f[i-1][j-k*v[i]]+k*w[i] \}\),复杂度 \(O(nV*\sum num_i)\) 可以发现求\ ...
- config、option、setting辨析
作为一个编程新手,在软件目录中常常会看到这几个词,尤其 config . setting 翻译成中文区别不是很大,总让人有点区分不了他们的使用场景.在知乎上看到了关于这个问题的讨论觉得受益挺大的,自己 ...
- (Tcp协议)linux上netstat -atunlp后出现的数据的意思(socket状态)
https://zhidao.baidu.com/question/486077599.html 1.netstat命令的-t参数指的是 tcp的简写,意思是仅显示tcp相关选项2.示例:列出所有 t ...
- db2报错信息
sqlcode sqlstate 说明000 00000 SQL语句成功完成01xxx SQL语句成功完成,但是有警告+012 01545 未限定的列名被解释为一个有相互关系的引用+098 01568 ...
- ECharts的geojson地图数据下载(根据城市区划代码的前六位查询)
链接如下: http://echarts.baidu.com/echarts2/doc/example/geoJson/china-main-city/522200.json 想要对应城市的geojs ...
- WIN10平板 如何关闭自动更新
运行,services.msc打开组策略 找到Windows Update,设置启动类型为禁用即可
- flex bison
https://www.gnu.org/software/bison/manual/bison.html https://blog.csdn.net/sirouni2003/article/detai ...
- 使用robot_pose_ekf对传感器信息融合
robot_pose_ekf是ROS Navigation stack中的一个包,通过扩展卡尔曼滤波器对imu.里程计odom.视觉里程计vo的数据进行融合,来估计平面移动机器人的真实位置姿态,输出o ...
- Mysql 8 常用命令测试
1.创建数据库,帐号及授权 create database testdb; CREATE USER 'rusking'@'%' IDENTIFIED BY '12345678'; CREATE USE ...