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 ...
随机推荐
- 洛谷P1198 [JSOI2008]最大数(BZOJ.1012 )
To 洛谷.1198 最大数 题目描述 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值. 限制:L不超过当 ...
- 【11.5校内测试】【倒计时5天】【DP】【二分+贪心check】【推式子化简+线段树】
Solution 非常巧妙的建立DP方程. 据dalao们说题目明显暗示根号复杂度??(反正我是没看出来 因为每次分的块大小一定不超过$\sqrt n$,要不然直接每个位置开一个块答案都才为$n$. ...
- Codeforces 989E A Trance of Nightfall 矩阵快速幂+DP
题意:二维平面上右一点集$S$,共$n$个元素,开始位于平面上任意点$P$,$P$不一定属于$S$,每次操作为选一条至少包含$S$中两个元素和当前位置$P$的直线,每条直线选取概率相同,同一直线上每个 ...
- cocos2d-x入门学习--准备篇
1.Cocos2D最早是一款用Python语言开发的游戏引擎.Cocos2D是一个开源框架,用于构建二维游戏,演示程序和其他图形界面交互应用等. 2.x的包含两个意思:一方面是C++的文件扩展为CXX ...
- STL——配接器、常用算法使用
学习STL,必然会用到它里面的适配器和一些常用的算法.它们都是STL中的重要组成部分. 适配器 在STL里可以用一些容器适配得到适配器.例如其中的stack和queue就是由双端队列deque容器适配 ...
- mybatis学习之路----mysql批量新增数据
原文:https://blog.csdn.net/xu1916659422/article/details/77971867 接下来两节要探讨的是批量插入和批量更新,因为这两种操作在企业中也经常用到. ...
- SVN clean失败解决方法【转】
原文地址:http://blog.csdn.net/victory08/article/details/42100325/ svn执行clean up后出现提示:svn cleanup failed– ...
- jconsole工具使用
Jconsole,Java Monitoring and Management Console. Jconsole是JDK自带的监控工具,在JDK/bin目录下可以找到.它用于连接正在运行的本地或者远 ...
- js处理时间时区问题
问题背景:服务器时间是东八区时间,页面会在全世界各地,页面 JS 功能需要对比服务器时间和用户本地时间,为兼容世界各地时间,需要将用户本地时间转换为东八区时间 一.基本概念 1.格林威治时间 格林威治 ...
- linux下安装python dlib依赖
dlib是主要用于机器学习的库,封装了机器学习算法,可以非常方便的实现比如人脸识别,车辆识别,物体检测以其他很多功能,dlib默认使用C++进行开发,另外图像识别有一部分支持python接口开发,上手 ...