[ASP.NET] 结合Web API在OWIN下实现OAuth
OAuth(Open Authorization)
为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是OAuth的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此OAuth是安全的。
本节目录:
1.创建一个控制台项目(其实类库都可以)ApiServer
Nuget引用:
Install-Package Microsoft.AspNet.WebApi.OwinSelfHost
或者引用以下三个
Install-Package Microsoft.AspNet.WebApi.Owin (让WebApi作为中间件)
Install-Package Microsoft.Owin.Hosting (Hosting接口默认使用HttpListener作为Server)
Install-Package Microsoft.Owin.Host.HttpListener (默认的Server实现)
2.添加Startup类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public void Configuration(IAppBuilder app) { // 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888 ApiConfig(app); } private static void ApiConfig(IAppBuilder app) { var config = new HttpConfiguration(); config.Routes.MapHttpRoute( name: "DefaultApi" , routeTemplate: "api/{controller}/{action}/{id}" , defaults: new { id = RouteParameter.Optional , action = RouteParameter.Optional } ); app.UseWebApi(config); } |
如何让Owin关联到Startup类的方法,可以看我的博客:
[ASP.NET] 下一代ASP.NET开发规范:OWIN
3.创建一个Api控制器
1 2 3 4 5 6 7 | public class ValuesController : ApiController { public string Get() { return "Never、C" ; } } |
4.Main方法启动
1 2 3 4 5 6 7 8 9 | static void Main( string [] args) { const string url = "http://localhost:1234/" ; using (WebApp.Start<Startup>(url)) { Console.WriteLine( "开启成功" ); Console.ReadLine(); } } |
5.浏览器访问
在上面的Owin Web API的基础上,开始实现OAuth.
Nuget:
Install-Package Microsoft.Owin.Security.OAuth(owin的oauth的实现)
使用OAuth会要求Owin使用UseOAuthBearerTokens认证方式,所以引用
Install-Package Microsoft.AspNet.Identity.Owin
1.在Startup添加一个中间件配置
1 2 3 4 5 6 7 8 9 10 11 | private static void OAuthConfig(IAppBuilder app) { var OAuthOptions = new OAuthAuthorizationServerOptions { TokenEndpointPath = new PathString( "/token" ), Provider = new OTWAuthorizationServerProvider(), AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), AllowInsecureHttp = true , }; app.UseOAuthBearerTokens(OAuthOptions); } |
并且设置Web API使用OAuth
1 2 | config.Filters.Add( new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); //添加的配置 app.UseWebApi(config); |
2.自定义的provider
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public class OTWAuthorizationServerProvider : OAuthAuthorizationServerProvider { //1.验证客户 public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) {<br> //此处可以判断client和user <br> //this.ClientId = clientId; //this.IsValidated = true; //this.HasError = false; context.Validated( "自定义的clientId" ); return base .ValidateClientAuthentication(context); } //授权客户 public override Task GrantClientCredentials(OAuthGrantClientCredentialsContext context) { var ticket = new AuthenticationTicket( new ClaimsIdentity( new [] { new Claim(ClaimTypes.Name, "Never、C" ) }, context.Options.AuthenticationType), null ); //this.Ticket = ticket; //this.IsValidated = true; //this.HasError = false; context.Validated(ticket); return base .GrantClientCredentials(context); } } |
3.用客户端来调用我们的(建议不要用单元测试,此处新建一个控制台项目)
1 2 3 4 5 6 7 | static void Main( string [] args) { const string url = "http://localhost:1234/" ; var client = new HttpClient(); var rst = client.PostAsync(url + "token" , new StringContent( "grant_type=client_credentials" )).Result.Content.ReadAsStringAsync().Result; Console.WriteLine(rst); } |
4.先启动服务端,再启动客户端
1.ValuesController添加特性Authorize
1 2 3 4 5 6 7 8 | [Authorize] public class ValuesController : ApiController { public string Get() { return User.Identity.Name; } } |
访问会返回
{"Response status code does not indicate success: 401 (Unauthorized)."}
2.客户端引用
Install-Package Newtonsoft.Json -Version 7.0.1
3.修改Main方法,带上Token
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class Program { static void Main( string [] args) { const string url = "http://localhost:1234/" ; var client = new HttpClient(); var rst = client.PostAsync(url + "token" , new StringContent( "grant_type=client_credentials" )).Result.Content.ReadAsStringAsync().Result; var obj = JsonConvert.DeserializeObject<Token>(rst); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( "Bearer" , obj.AccessToken); rst = client.GetStringAsync(url + "api/values" ).Result; Console.WriteLine(rst); Console.ReadLine(); } } public class Token { [JsonProperty( "Access_Token" )] public string AccessToken { get ; set ; } } |
4.先启动服务端,再启动客户端
扩展
其实OAuth自己也能实现,本质是生成一个加密的唯一的字符串
OAuth的实现方案还有DotNetOpenAuth、Thinktecture IdentityServer
本文地址:http://neverc.cnblogs.com/p/4970996.html
参考:
http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/
http://www.cnblogs.com/dudu/p/4569857.html
http://www.cnblogs.com/xizz/p/5038923.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义