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 ...
随机推荐
- Python HTTP 请求时对重定向中的 cookie 的处理
首先说明一下,我使用的是 Python3 的 urllib,但 Python2.x 同理(使用 urllib2). 想用脚本去登录一个网站.和很多网站一样,该网站使用 cookie 来保存会话信息.这 ...
- BZOJ.1927.[SDOI2010]星际竞速(无源汇上下界费用流SPFA /最小路径覆盖)
题目链接 上下界费用流: /* 每个点i恰好(最少+最多)经过一次->拆点(最多)+限制流量下界(i,i',[1,1],0)(最少) 然后无源汇可行流 不需要源汇. 注: SS只会连i',求SS ...
- php 解析HTTP协议六种请求方法,get,head,put,delete,post有什么区别
GET: 请求指定的页面信息,并返回实体主体.HEAD: 只请求页面的首部.POST: 请求服务器接受所指定的文档作为对所标识的URI的新的从属实体.PUT: 从客户端向服务器传送的数据取代指定的文档 ...
- 20172302 《Java软件结构与数据结构》第三周学习总结
2018年学习总结博客总目录:第一周 第二周 第三周 教材学习内容总结 第五章 队列 1.队列是一种线性集合,其元素从一端加入,从另一端删除:队列元素是按先进先出(FIFO(First in Firs ...
- 项目出现小红叉,类名上带有 Implicit错误
Implicit super constructor Object() is undefined for default constructor. Must define an explicit co ...
- centos7 设置tomcat自启动
1 .vi /etc/init.d/tomcat8 #!/bin/bash # # tomcat startup script for the Tomcat server # # chkconfig ...
- Windows XP Ghost系统安装
一.双击Ghost系统安装工具,进入Ghost界面 二.依次单击[Local]-[Partition]-[From Image],可以简单记作1-2-3. 弹出对话框,选择.GHO文件,比如XP.GH ...
- Tkinter(2.x 与3.X的区别)
1.包的引入 2.X下是 from Tkinter import * 而3.x是 from tkinter import * 否则,会报找不到tkinter的错误 Traceback (most re ...
- zabbix 客户端安装配置
1.下载zabbix wget http://netix.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/2.4.7/zabb ...
- Android开发中adb启动失败adb连接异常的解决办法
一.情况描述: 我们在使用eclipse开发有时候会出现adb连接异常中,有时候控制台会打印出来 adb connect异常 比如会出现下面这样 : [2014-12-18 16:18:26 ...