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# 版的更多相关文章

  1. IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API

    IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...

  2. 理解OAuth 2.0

    转自:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛 ...

  3. 理解OAuth 2.0(转载)

    作者: 阮一峰 原文地址:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标 ...

  4. 用户授权 OAuth 2.0

    什么是OAuth OAuth是一个关于授权(Authorization)的开放网络标准,目前的版本是2.0版.OAuth适用于各种各样的包括提供用户身份验证机制的应用程序,注意是Authorizati ...

  5. [转]理解OAuth 2.0

    作者: 阮一峰 OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版. 本文对OAuth 2.0的设计思路和运行流程,做一个简明通俗的解释, ...

  6. 理解OAuth 2.0[摘]

    原文地址:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到 ...

  7. [转发] 理解 oauth 2.0

    原文: http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html oauth 的各种编程语言实现: http://oauth.net/2/ 理解OAu ...

  8. 理解OAuth 2.0 -摘自网络

    OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版.                                      本文对OA ...

  9. 【转载】理解OAuth 2.0

    http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html 作者: 阮一峰 日期: 2014年5月12日 OAuth是一个关于授权(authorizat ...

随机推荐

  1. asp.net core模块学习

    一.配置管理 二.管道 三.认证与授权 四.MVCDemo 五.IdentityServer4 一.配置管理 1,读取内存配置 using System; using Microsoft.Extens ...

  2. NTFS的交换数据流ADS应用

    NTFS的交换数据流ADS应用   NTFS是Windows常用的文件系统格式.该格式支持交换数据流(Alternate Data Streams,缩写ADS)特性.该特性可以让多个文件流使用同一个文 ...

  3. 洛谷 P2574 XOR的艺术(线段树 区间异或 区间求和)

    To 洛谷.2574 XOR的艺术 题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的 ...

  4. extend与append的区别

    ''' list 的两个方法extend 和 append 看起来类似,但实际上完全不同. extend接受一个参数,这个参数,总是一个list,并把list中的每个元素添加到原list中 appen ...

  5. jsp导出简单的excel

    在jsp中加入以下代码即可 <% String fileName = "导出excel.xls"; fileName = new String(fileName.getByt ...

  6. java读取数据,2,2,1方式读取

    /*   * for(int i=0;i<15;)   * { for(int j=0;j<5;j++,i++)   *    {    *      if(j%2==0&& ...

  7. Saltstack 分发

    把master上的hosts文件分发到所有主机 [root@node1 ~]# salt-cp '*' /etc/hosts /etc

  8. 用vue的自定义组件写了一个拖拽 组件,局部的 只能在自定义元素内的

    简单实现 没有做兼容<!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  9. 中文分词组件:thulac及jieba试用手记

    一.THULAC THULAC由<清华大学自然语言处理与社会人文计算实验室>研制推出的一套中文词法分析工具包.官网地址:http://thulac.thunlp.org,该项目提供了多种语 ...

  10. Delphi不注册COM直接使用ActiveX控件并绑定事件

    文笔不行,直接上源码: 主窗口: unit Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System ...