ASP.NET OAuth 2.0 新手上路
OAuth2.0资料
初衷:一直想整理授权系列demo,让自己项目高端大尚,列出新手授权系列,帮助小白程序员不用在为授权头疼
OAuth 允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的 2 小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。这样,OAuth 让用户可以授权第三方网站访问他们存储在另外服务提供者的某些特定信息,而非所有内容。
以上概念来自:https://zh.wikipedia.org/wiki/OAuth
详细理论知识,参考文章如下文章,本文章重在实践
1.http://www.cnblogs.com/lanxiaoke/p/6358332.html
2.https://www.cnblogs.com/selimsong/p/8037717.html
3.http://www.cnblogs.com/xishuai/p/aspnet-webapi-owin-oauth2.html
项目实践开发
步骤1和步骤2都行,看官乐意就行
步骤1
通过NuGet安装
Microsoft.Owin.Security.OAuth
Owin Microsoft.Owin.Host.SystemWeb(重点)
步骤2
Owin Microsoft.Owin.Host.SystemWeb(重点)
Microsoft.Owin.Security.OAuth
Microsoft.Owin.Security.Cookies(可忽略)
Microsoft.AspNet.Identity.Owin
重点在于步骤1少了一个核心dll,少了这个核心dll无法启动部署owin
新增Startup.cs
[assembly: OwinStartup(typeof(OAuth2.Startup))]
namespace OAuth2
{
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureAuth(app);
}
}
}
Owin Microsoft.Owin.Host.SystemWeb 通过这个dll,程序启动时候注册,如果不引用,该方法不会生效,看官可以打个断点试一试
新增Startup.Auth.cs
namespace OAuth2
{
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
{
//从url中获取token,兼容hearder方式
//Provider = new QueryStringOAuthBearerProvider("access_token")
});
var OAuthOptions = new OAuthAuthorizationServerOptions
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"), //获取 access_token 认证服务请求地址
AuthorizeEndpointPath = new PathString("/authorize"), //获取 authorization_code 认证服务请求地址
AccessTokenExpireTimeSpan = TimeSpan.FromSeconds(), //access_token 过期时间 Provider = new OpenAuthorizationServerProvider(), //access_token 相关认证服务
AuthorizationCodeProvider = new OpenAuthorizationCodeProvider(), //authorization_code 认证服务
RefreshTokenProvider = new OpenRefreshTokenProvider() //refresh_token 认证服务
}; app.UseOAuthBearerTokens(OAuthOptions); //表示 token_type 使用 bearer 方式 }
} public class QueryStringOAuthBearerProvider : OAuthBearerAuthenticationProvider
{
readonly string _name; public QueryStringOAuthBearerProvider(string name)
{
_name = name;
} public override Task RequestToken(OAuthRequestTokenContext context)
{
var value = context.Request.Query.Get(_name); if (!string.IsNullOrEmpty(value))
{
context.Token = value;
} return Task.FromResult<object>(null);
}
} }
眼光犀利的同学肯定注意到这两个类名相同,命名空间也相同,为什么没有报错 请注意关键字 partial
OpenAuthorizationServerProvider示例代码 详细见demo,只提代码需要注意地方
/// <summary>
/// 验证 client 信息
/// </summary>
public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
string clientId;
string clientSecret;
if (!context.TryGetBasicCredentials(out clientId, out clientSecret))
{
context.TryGetFormCredentials(out clientId, out clientSecret);
} if (clientId != "xishuai" || clientSecret != "")
{
context.SetError("invalid_client", "client or clientSecret is not valid");
return;
}
context.Validated();
}
public string BaseString()
{
string clientId = "xishuai";
string clientSecret = "";
return Convert.ToBase64String(Encoding.ASCII.GetBytes(clientId + ":" + clientSecret));
}
验证生效如图 按照如下格式 key:value,然后base64编码
context.TryGetBasicCredentials 否则解析不了 验证不通过
OpenAuthorizationCodeProvider示例代码 详细见demo
OpenRefreshTokenProvider 示例代码 详细见demo
新增ValueController.cs
public class ValueController : ApiController
{
// GET api/values access_token验证才能访问
[Authorize]
[HttpGet]
public IEnumerable<string> Index()
{
return new string[] { "value1", "value2" };
}
//获取授权code
[HttpGet]
[Route("api/authorization_code")]
public HttpResponseMessage Get(string code)
{
return new HttpResponseMessage()
{
Content = new StringContent(code, Encoding.UTF8, "text/plain")
};
} }
新增OAuthon2Controller.cs
public class OAuthon2Controller : Controller
{
//根据你项目端口
private const string HOST_ADDRESS = "http://localhost:60903"; // GET: OAuthon2 直接获取授权code链接,方便获取code
public string Index()
{
string clientId = "xishuai";
string url = $"{HOST_ADDRESS}/authorize?grant_type=authorization_code&response_type=code&client_id={clientId}&redirect_uri={HttpUtility.UrlEncode($"{HOST_ADDRESS}/api/authorization_code")}";
return url;
} }
根据获取的url, 在将红色部分url复制出来到浏览器中可以获取到code
现在code有了 将获取access_token
grant_type:authorization_code
code:图上红色url返回给你的
client_id:xishuai 可以理解为appid 自定义,因为代码中固定了,你可以改
redirect_uri:这个链接你也能改的,接受code 在ValueController.cs (action:api/authorization_code)
http://localhost:60903/api/authorization_code
这个地方需要注意 需要和你获取code redirect_uri保持一致就行
string url = $"{HOST_ADDRESS}/authorize?grant_type=authorization_code&response_type=code&client_id={clientId}&redirect_uri={HttpUtility.UrlEncode($"{HOST_ADDRESS}/api/authorization_code")}";
然后你就拿到access_token 去调用 api/Value/Index
如果这个地方你输入错,会获取失败
Authorization Bearer后面空格 在输入access_token
ASP.NET OAuth 2.0 新手上路的更多相关文章
- ASP.NET WebApi OWIN 实现 OAuth 2.0
OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth 允许用户提供一个令牌, ...
- IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API
IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...
- [转]An introduction to OAuth 2.0 using Facebook in ASP.NET Core
本文转自:http://andrewlock.net/an-introduction-to-oauth-2-using-facebook-in-asp-net-core/ This is the ne ...
- ASP.NET 中OAUTH 2.0 及OPENID CONNECT的介绍
了解以下内容对ASP.NET 5中的验证中间件应用有很大帮助! OAUTH2是目前很多大型网站都使用的对外提供开放资源接口的应用标准,比入taobao\alipay\腾讯\豆瓣等.它和目前的另 ...
- asp.net权限认证:OWIN实现OAuth 2.0 之客户端模式(Client Credential)
asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...
- asp.net权限认证:OWIN实现OAuth 2.0 之密码模式(Resource Owner Password Credential)
asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...
- asp.net权限认证:OWIN实现OAuth 2.0 之授权码模式(Authorization Code)
asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...
- asp.net权限认证:OWIN实现OAuth 2.0 之简化模式(Implicit)
asp.net权限认证系列 asp.net权限认证:Forms认证 asp.net权限认证:HTTP基本认证(http basic) asp.net权限认证:Windows认证 asp.net权限认证 ...
- ASP.NET WebApi OWIN 实现 OAuth 2.0(自定义获取 Token)
相关文章:ASP.NET WebApi OWIN 实现 OAuth 2.0 之前的项目实现,Token 放在请求头的 Headers 里面,类似于这样: Accept: application/jso ...
随机推荐
- PHP中的=>,->,@,&,::,%
在php中数组默认键名是整数,也可以自己定义任意字符键名(最好是有实际意义).如: $css=array('style'=>'0',‘color’=>‘green‘), 则$css['st ...
- pm无力的话
1. 先这样做吧, 等不行再改 2. 用户的需求不明确, 他们对于自己的业务也不明白, 现在是我们在帮助他们缕清自己的业务, 这个迭代的过程中,有很多问题,我们程序员既不能参与到业务, 也不能猜测业务 ...
- Synergy使用(安装及配置)
最近在看一篇文章,找到了一款符合我需求的软件:Synergy. Synergy可以在多台电脑上进行鼠标与键盘及剪贴板(只能共享文本)的共享.不用每台电脑都插上这些外设了... 共享文件可以参看微软出品 ...
- PHP报错open_basedir restriction in effect
问题是出现在了PHP.INI上面了 原因是php.ini里设置了 open_basedir=/var/web/w0895/:/tmp:/usr/lib/php 这里加上相关的目录就可以了 解答:其实o ...
- apache 搭建PHP多站点
修改apache 配置文件:httpd.conf 1.默认 Listen 80端口 2.添加配置如下: <VirtualHost *:80> ServerAdmin admin@yii.c ...
- Visio2013 64位下载安装以及破解激活教程
特别说明:以下教程如果未能破解激活,请在断网条件下安装破解!!!! 安装: Visio2013 professional版下载地址:https://pan.baidu.com/s/1gzwcGTevV ...
- 迷你MVVM框架 avalonjs 0.83发布
本版本做了如下改进: 重构计算属性, 这是@soom提出的BUG,发现计算属性被某个监控属性向上驱动更新自己时,不会解发$watch回调.详见这里. 强化ms-bind绑定,当第一次扫描时也会执行它的 ...
- MVC4中压缩和合并js文件和样式文件
1.在App_Start文件夹中BundleConfig.cs类中添加相应的文件 1.1bundles.Add(new ScriptBundle("~/bundles/adminJs&quo ...
- python之name binding
[python之name binding] 1. 名字 名字是对一个对象的称呼,一个对象可以只有一个名字,也可以没有名字或取多个名字.但对象自己却不知道有多少名字,叫什么,只有名字本身知道它所指向 ...
- Source命令及脚本的执行方式
[Source命令及脚本的执行方式] source filename 与 sh filename 及./filename执行脚本的区别在那里呢? 1.当shell脚本具有可执行权限时,用sh file ...