博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
OAuth2 .net MVC实现获取token
阅读量:5143 次
发布时间:2019-06-13

本文共 3801 字,大约阅读时间需要 12 分钟。

OAuth2 的原理这里不多讲,可以看:https://www.cnblogs.com/icebutterfly/p/8066548.html

直奔主题:这里要实现的功能为,统计微软的Owin程序集实现本地获取token,完成token工作。

上代码:

第一步:配置Startup.Auth.cs

public partial class Startup    {        public void ConfigureAuth(IAppBuilder app)        {            app.UseOAuthAuthorizationServer(new OAuthAuthorizationServerOptions            {                AllowInsecureHttp = true,                TokenEndpointPath = new PathString("/oauth2/token"),//设置获取token地址                Provider = new MyOAuthAuthorizationServerProvider(),//自定义token验证                AccessTokenExpireTimeSpan = TimeSpan.FromSeconds(300)//定义token过期时间            });            //下面必须加用bearer方式            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()            {            });        }    }

第二步:继承OAuthAuthorizationServerProvider接口,重新里面的严重方法。我只实现通过用户名密码获取token,所以只重写两个方法即可

public class MyOAuthAuthorizationServerProvider : OAuthAuthorizationServerProvider    {        public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)        {            string clientId;            string clientSecret;            if (!context.TryGetBasicCredentials(out clientId, out clientSecret))            {                context.TryGetFormCredentials(out clientId, out clientSecret);            }            if (context.ClientId == null)            {                context.SetError("invalid_clientId", "client_Id is not set");                return Task.FromResult(null);            }            if (!string.IsNullOrEmpty(clientSecret))            {                context.OwinContext.Set("clientSecret", clientSecret);            }            var client = ClientRepository.Clients.Where(c => c.Id == clientId).FirstOrDefault();            if (client != null)            {                context.Validated();            }            else            {                context.SetError("invalid_clientId", string.Format("Invalid client_id '{0}'", context.ClientId));                return Task.FromResult(null);            }            return Task.FromResult(null);        }        public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)        {            //这里写验证代码            if (context.UserName=="admin"&&context.Password=="123456")            {                var identity = new ClaimsIdentity(                    new GenericIdentity(context.UserName,                    OAuthDefaults.AuthenticationType),                    context.Scope.Select(x => new Claim("urn:oauth:scope", x)));                context.Validated(identity);            }            else            {                context.SetError("invalid_grant", "The user name or password is incorrect");                return Task.FromResult(null);            }            return Task.FromResult(0);        }    }

第三步:定义Client实体

public class Client    {        public string Id { get; set; }    }    public class ClientRepository    {        public static List
Clients = new List
() { new Client{ Id = "test1" }, new Client{ Id = "test2", } }; }

第四步:编写测试方法

public class HomeController : Controller    {        [Authorize]//授权标签        public ActionResult Test()        {            //获取到授权登陆用户            var authentication = HttpContext.GetOwinContext().Authentication;            string name= authentication.User.Identity.Name;            return Json(new { Message="Hello world",name= name });        }    }
View Code

 

OK,就这么简单完成。

现在来测试:

第一步:获取token,我用的POSTMan。成功获取到token

 第二步:用postman测试也行,这里贴出用ajax请求的结果

测试结果为:

{    "Message": "Hello world",    "name": "admin"}

 

转载于:https://www.cnblogs.com/zhuyapeng/p/10520523.html

你可能感兴趣的文章
MongoDB基本命令用【转】
查看>>
java字节流复制文件
查看>>
重载和覆盖
查看>>
实验二 进程调度预备
查看>>
修改主机名
查看>>
《C#高级编程》读书笔记
查看>>
如何在mysql查找效率慢的SQL语句
查看>>
斯大林格勒拖拉机厂LCA项目研制成功
查看>>
git 分支
查看>>
Why And When To Use Pre-Update and Pre-Insert Triggers In Oracle Forms
查看>>
7zip在DOS命令行用法总结
查看>>
死锁AB-BA问题
查看>>
<WEB>平板_手机开发_13 个处理触摸事件和多点触摸的JS 库
查看>>
JS方法在iframe父子窗口间的调用
查看>>
笔记本上任务栏显示电池电量使用情况的图标不见了怎么办?
查看>>
Xcode开发 字符串用法
查看>>
在IIS中实现JSP
查看>>
[转载]Meta标签详解
查看>>
File,FileStream,byte[]3者互相转换总结(转)
查看>>
springboot 使用devtools 实现热部署
查看>>