WEBAPI 增加身份验证 (OAUTH 2.0方式)

1,在Webapi项目下添加如下引用:

Microsoft.AspNet.WebApi.Owin

Owin

Microsoft.Owin.Host.SystemWeb

Microsoft.Owin.Security.OAuth

Microsoft.Owin.Security.Cookies

Microsoft.AspNet.Identity.Owin

Microsoft.Owin.Cors

2, 在项目下新建Startup类,这个类将作为owin的启动入口,添加下面的代码

3,修改 Startup类中方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888
        ConfigAuth(app);
        HttpConfiguration config = new HttpConfiguration();
        WebApiConfig.Register(config);
        app.UseCors(CorsOptions.AllowAll);
        app.UseWebApi(config);
    }
    public void ConfigAuth(IAppBuilder app)
    {
        OAuthAuthorizationServerOptions option = new OAuthAuthorizationServerOptions()
        {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/token"), //获取 access_token 授权服务请求地址
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1), //access_token 过期时间
            Provider = new SimpleAuthorizationServerProvider(), //access_token 相关授权服务
            RefreshTokenProvider = new SimpleRefreshTokenProvider() //refresh_token 授权服务
        };
        app.UseOAuthAuthorizationServer(option);
        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
    }
}

4, OAuth身份认证,新建SimpleAuthorizationServerProvider类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
    public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
    {
        context.Validated();
        return Task.FromResult<object>(null);
    }
    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin"new[] { "*" });
        AccountService accService = new AccountService();
        string md5Pwd = LogHelper.MD5CryptoPasswd(context.Password);
        IList<object[]> ul = accService.Login(context.UserName, md5Pwd);
        if (ul.Count() == 0)
        {
            context.SetError("invalid_grant""The username or password is incorrect");
            return;
        }
        var identity = new ClaimsIdentity(context.Options.AuthenticationType);
        identity.AddClaim(new Claim("sub", context.UserName));
        identity.AddClaim(new Claim("role""user"));
        context.Validated(identity);
    }
}

5, 新建SimpleRefreshTokenProvider类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class SimpleRefreshTokenProvider : AuthenticationTokenProvider
{
    private static ConcurrentDictionary<stringstring> _refreshTokens = new ConcurrentDictionary<stringstring>();
    /// <summary>
    /// 生成 refresh_token
    /// </summary>
    public override void Create(AuthenticationTokenCreateContext context)
    {
        context.Ticket.Properties.IssuedUtc = DateTime.UtcNow;
        context.Ticket.Properties.ExpiresUtc = DateTime.UtcNow.AddDays(60);
        context.SetToken(Guid.NewGuid().ToString("n"));
        _refreshTokens[context.Token] = context.SerializeTicket();
    }
    /// <summary>
    /// 由 refresh_token 解析成 access_token
    /// </summary>
    public override void Receive(AuthenticationTokenReceiveContext context)
    {
        string value;
        if (_refreshTokens.TryRemove(context.Token, out value))
        {
            context.DeserializeTicket(value);
        }
    }
}

6, 在要加验证的接口上加上[Authorize]标记

1
2
3
4
5
6
7
8
9
10
[Authorize]
public class EmployeeController : ApiController
{
    //查询所有员工
    [HttpGet]
    public IList<UC_Employee> GetAllEmps()
    {
      return new List<UC_Employee>();
    }
}

7,调用api程序

 

8,传入参数,获取token

9,传入access_token

本文版权归作者和博客园共有,欢迎转载,但未经作者同意需保留此段声明,且在文章页面明显位置给出原文连接。

作者:Lnice
出处:http://www.cnblogs.com/lnice

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/286439.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无代码iVX编程实现简单 小蜜蜂 经典游戏

首先咱们打开 iVX 的在线编辑器&#xff1a;https://editor.ivx.cn/ 随后选择相对定位&#xff0c;咱们选择2D游戏类型制作一个简单小蜜蜂游戏&#xff1a; 接着咱们创建一个物理世界&#xff0c;并且将页面布局如以下&#xff1a; 以上布局中&#xff0c;矩形为模拟飞机、…

【无人机航空摄影测量精品教程】目录:Pix4d、EPS、CC、PhotoScan、Godwork项目化作业流程及注意事项汇总

文章目录1. 专栏简介2. 专栏地址3. 专栏目录1. 专栏简介 该专栏为目前最为热门的无人机航测内外业项目&#xff0c;主要内容包括&#xff1a;无人机航测外业作业流程&#xff08;像控点布设、航线规划、仿地飞行、航拍&#xff09;和内业数据处理软件&#xff08;Pix4d、CC、EP…

WPF 基础控件之 Slider 样式

其他基础控件1.Window2.Button3.CheckBox4.ComboBox5.DataGrid 6.DatePicker7.Expander8.GroupBox9.ListBox10.ListView11.Menu12.PasswordBox13.TextBox14.RadioButton15.ToggleButtonSlider 实现下面的效果1&#xff09;Slider来实现动画&#xff1b;Grid嵌套 Border并设置S…

SQL 通过syscolumns.xtype动态查找指定数据类型字段所包含的数据

表中太多列&#xff0c;只想查找某些比如&#xff0c;数据类型为varchar的字段的数据。 思路&#xff1a;1、先获取列名&#xff1a; select * from syscolumns where id(select max(id) from sysobjects where xtypeu and nametest_A)2、查找指定数据类型&#xff0c;xtype就…

css案例学习之span边框实现的特殊效果

bottom left bottom right top left top right 配合颜色来使用&#xff0c;实现一些神奇的效果 #menu a span{height:0;width:0;/*border-top:solid 6px #fff;border-left:solid 6px #f90;*//*border-top:solid 6px #fff;border-right:solid 6px #f90;*//*border-bottom:solid …

网页版消消乐快速实现,无代码吗iVX 真那么简单?

最近没事想做个消消乐&#xff0c;然后听说 iVX 免费了&#xff0c;所以又跑去看看 iVX 了&#xff0c;就用一个无代码来看看消消乐怎么玩吧。 首先咱们打开 iVX 的在线编辑器&#xff1a;https://editor.ivx.cn/ 随后咱们不需要游戏类型也可以制作一个消消乐游戏&#xff1a…

虚拟化记录--No.1

近段时间&#xff0c;会花些时间做关于系统虚拟化的工作。所以会做一些这样的记录。相信很多东西不会特别成体系&#xff0c;每个人因为关注的不同而记录和学习的重点也会有比较大的出入。这篇是NO.1(注意不是TOP 1 )真的是由于对于ORACLE很有感觉&#xff0c;所以上手去做的也…

C# Java间进行RSA加密解密交互

这里&#xff0c;讲一下RSA算法加解密在C#和Java之间交互的问题&#xff0c;这两天纠结了很久&#xff0c;也看了很多其他人写的文章&#xff0c;颇受裨益&#xff0c;但没能解决我的实际问题&#xff0c;终于&#xff0c;还是被我捣鼓出来了。 首先&#xff0c;介绍一下写这代…

【Microstation】三维建模基础及软件入门到精通实验教程目录

文章目录1. 专栏简介2. 专栏地址3. 专栏目录1. 专栏简介 MicroStation是一款非常不错的二维和三维设计软件&#xff0c;由奔特力&#xff08;Bentley&#xff09;工程软件系统有限公司开发的一款软件。在CAD设计上该软件是和AutoCAD是齐名的软件&#xff0c;其专用的文件格式是…

无代码iVX编程实现简单魂斗罗

首先咱们打开 iVX 的在线编辑器&#xff1a;https://editor.ivx.cn/ 随后咱们选择2D游戏类型制作一个简单魂斗罗游戏&#xff1a; 随后咱们开始创建一个物理世界&#xff0c;不并且在物理世界之下创建一个一个图片添加物体属性&#xff0c;在物体属性中更改对应的属性内容&am…

【ArcGIS遇上Python】ArcGIS Python批处理入门到精通实用教程目录

文章目录1. 专栏简介2. 专栏地址3. 专栏目录1. 专栏简介 Python语言是目前很火热的语言&#xff0c;极大的促进了人工智能发展。你知道在ArcGIS中也会有python的身影吗&#xff1f;事实上&#xff0c;在ArcGIS中使用Python会起到事半功倍的效果&#xff0c;大大提高工作效率&am…

Android使用C/C++来保存密钥

Android使用C/C来保存密钥本文主要介绍如何通过native方法调用取出密钥&#xff0c;以替代原本直接写在Java中&#xff0c;或写在gradle脚本中的不安全方式。为什么要这么做 如果需要在本地存储一个密钥串&#xff0c;典型的方式有 1. 直接写在java source code中 2. 写在gradl…

无代码iVX编程实现简单跳跃超级玛丽游戏

首先咱们打开 iVX 的在线编辑器&#xff1a;https://editor.ivx.cn/ 随后咱们选择2D游戏类型制作一个简单跳跃游戏&#xff1a; 接下来创建几个图片&#xff0c;并且添加物体&#xff0c;如图所示&#xff1a; 在此需要更改对应称重地面的阻尼值&#xff0c;让其能够缓慢降落…

【三维激光扫描】实验01:环境搭建CAD2014+StonexSiScan软件安装

目 录 一、CAD2014简体中文版安装1. 安装过程2. 激活过程二、Si-Scan安装1. 主程序安装2. 驱动安装一、CAD2014简体中文版安装 1. 安装过程 双击安装包:AutoCAD_2014_Simplified_Chinese_Win_64bit_dlm.sfx.exe,进行自解压。 解压完成后,如下图所示,点击【安装】。 接受许…

C# 11 新特性:原始字符串

之前我们经常需要使用 string 类型定义字符串文本&#xff0c;字符串文本用一对双引号括起来表示&#xff1a;var str "Hello MyIO";字符串可包含任何字符文本&#xff0c;但是有些字符需要转义才能表示&#xff0c;比如双引号要转义成\"&#xff1a;var str …

bzoj1011

因为允许5%的误差。。所以把&#xff1e;一定长度的一段看成一段近似计算就行了。。 1 #include<cstdio>2 #include<cstdlib>3 #include<cstring>4 #include<ctime>5 #include<cmath>6 #include<iostream>7 #include<algorithm>8 #i…

一名全栈工程师的必备“百宝箱”

摘要&#xff1a;全栈工程师&#xff0c;也叫全端工程师&#xff0c;是指掌握多种技能&#xff0c;并能利用多种技能独立完成产品的人。全栈工程师熟悉多种开发语言&#xff0c;同时具备前端和后台开发能力&#xff0c;从需求分析&#xff0c;原型设计到产品开发&#xff0c;测…

为VMware虚拟主机添加新磁盘

轨迹: 关闭VMware虚拟主机 ---> 虚拟机 ---> 设置 ---> 硬件 ---> 硬盘 ---> 添加 ---> (弹出添加硬件向导)硬盘 ---> 磁盘类型 ---> 选择磁盘 ---> 指定磁盘容量(最好选择“将虚拟磁盘存储为单个文件”) ---> 指定磁盘文件 ---> 点击“完成…

【ArcGIS风暴】全站仪、RTK测量坐标数据在CASS和ArcGIS中展点的区别和联系(带数据)

ArcGIS展经纬度点完整教程:【ArcGIS风暴】ArcGIS 10.2导入Excel数据X、Y坐标(经纬度、平面坐标),生成Shapefile点数据图层 目录 1. CASS展点操作步骤2. ArcGIS展点操作步骤3. 案例数据下载RTK或全站仪地面实测的三维坐标数据文件一般包括点号,编码,东坐标,北坐标,高程等…

php一篇文零基础到制作在线图片编辑网站赚钱(gif压缩、九宫格裁剪、等比裁剪、大小变换)【php华为云实战】

注意本篇文适用于&#xff1a; 零基础小白想要了解一下php开发或者网站开发的同学&#xff08;但是注意&#xff0c;零基础你可以通过本篇完成&#xff0c;但是由于是速成会有一些难度&#xff0c;本篇内容由于是速成&#xff0c;有一些额外知识点&#xff0c;不会可以来问我1…