Webapi添加token认证功能

1.创建控制台应用程序

在 “文件” 菜单上,选择"项目"。 从安装的 “视觉C#对象” 下,选择 " Windows 桌面",然后选择 "控制台应用(.net Framework) "。 将项目命名为 “OwinSelfhostSample”,然后选择 “确定”。
在这里插入图片描述

2.添加 Web API 和 OWIN 包

从 “工具” 菜单中,选择 " NuGet 包管理器",然后选择 “程序包管理器控制台”。 在“Package Manager Console”窗口中,输入以下命令:

Install-Package Microsoft.AspNet.WebApi.OwinSelfHost

这会安装 WebAPI OWIN selfhost 包和所有必需的 OWIN 包。
因为这里会用到Mysql数据库,所以还要添加Mysql.Date,添加方法自行百度。

3.为自承载配置 Web API

在解决方案资源管理器中,右键单击项目并选择 “添加 / 类” 添加新类。 将此类命名为 Startup。
在这里插入图片描述
将代码替换成如下代码

  public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            HttpConfiguration config = new HttpConfiguration();

            ConfigureOAuth(app);

            //配置路由

            config.Routes.MapHttpRoute(

            name: "DefaultApi",

            routeTemplate: "api/{controller}/{id}",

            defaults: new { id = RouteParameter.Optional }

            );
            app.UseWebApi(config);

        }

        public void ConfigureOAuth(IAppBuilder app)
        {
            OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
            {
                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString("/api/token"),
                AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
                Provider = new ApplicationOAuthProvider()
            };
            app.UseOAuthAuthorizationServer(OAuthServerOptions);
            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
        }



    }

4.添加 Web API 控制器

接下来,添加 Web API 控制器类。 在解决方案资源管理器中,右键单击项目并选择 “添加 / 类” 添加新类。 将此类命名为 ValuesController。
将此文件中的所有样本代码替换为以下代码:

//此处添加授权认证,加上之后必须用token认证才可以访问接口
 [Authorize]
    public class ValuesController : ApiController
    {
        // GET api/values 
     
        public string  Get()
        {
            //string connetStr = "server = 192.168.0.121; user = admin; password = 123456; database = Login; persistsecurityinfo = True;";

            //MysqlHelper mysqlHelper = new MysqlHelper(connetStr);

            //mysqlHelper.Open();

            //string sql = "Select * from Login_t1 ";

            //MySqlDataReader mySqlDataReader = mysqlHelper.ExecuteReader(sql);

            //if (mySqlDataReader.HasRows)

            //     return "数据库连接成功";

            //else

            //     return "数据库连接失败";


            //return new string[] { "value1", "value2" };
            return "登录成功!";


        }

        // GET api/values/5 
        public string Get(int id)
        {
            return "value";
        }

        // POST api/values 
        public void Post([FromBody] string value)
        {
        }

        // PUT api/values/5 
        public void Put(int id, [FromBody] string value)
        {
        }

        // DELETE api/values/5 
        public void Delete(int id)
        {
        }
    }

5.添加ApplicationOAuthProvider认证类

右键单击项目创建新类并命名为ApplicationOAuthProvider
复制以下代码:

public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
    {
        public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
        {

            context.Validated();
            return Task.FromResult<object>(context);
        }
        public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {
            string username = context.UserName;
            string password = context.Password;
    //此处连接的数据库为虚拟机中的Mysql数据库,数据库创建及定义请自行百度
            string connetStr = "server = 192.168.0.121; user = admin; password = 123456; database = Login; persistsecurityinfo = True;";

            MysqlHelper mysqlHelper = new MysqlHelper(connetStr);
            mysqlHelper.Open();


            string sql = "Select * from Login_t1  WHERE username='" + username +"'AND password= '" + password+"'" +"";
            MySqlDataReader mySqlDataReader = mysqlHelper.ExecuteReader(sql);

            if (mySqlDataReader.HasRows)

            {

                Console.WriteLine( "用户名正确!");
            }

            else
            {
               Console.WriteLine("用户名或者密码错误");
                return null;
            }
//如果不熟悉Mysql数据库,也可以用下面注释的代码,直接写死。
            //if (username != "test001" || password != "123456")
            //{

            //    context.SetError("invalid_grant", "用户名或者密码错误");

            //    //var response = context.Response = context.Response ?? new HttpResponseMessage();
            //    //response.StatusCode = HttpStatusCode.Forbidden;
            //    //response

            //    return null;

            //}

            var identity = new ClaimsIdentity(context.Options.AuthenticationType);
            identity.AddClaim(new Claim("sub", username));
            context.Validated(identity);
            return Task.FromResult<Object>(identity);
        }

        public override Task ValidateAuthorizeRequest(OAuthValidateAuthorizeRequestContext context)
        {

            return base.ValidateAuthorizeRequest(context);

        }

        public override Task ValidateTokenRequest(OAuthValidateTokenRequestContext context)
        {

            return base.ValidateTokenRequest(context);

        }
    }

6.附上MysqlHelp类

右键单击项目创建新类并命名为MysqlHelper
复制以下代码:

class MysqlHelper
    {

        public string dbConnStr;
        public MySqlConnection dbConn = null;
        public MySqlCommand dbCmd = null;
        public MySqlDataReader dbDataReader = null;


        public MysqlHelper(string connectionString)
        {

            dbConnStr = connectionString;
            dbConn = new MySqlConnection(dbConnStr);
            dbCmd = new MySqlCommand();
            dbCmd.Connection = dbConn;

        }



        MysqlHelper()
        {
            Close();
        }

        public void Open()
        {
            dbConn.Open();
        }

        public void Close()
        {
            dbConn.Close();
        }

        public MySqlDataReader ExecuteReader(string sqlStr_Read)
        {
            dbCmd.CommandText = sqlStr_Read;

            dbDataReader = dbCmd.ExecuteReader();

            return dbDataReader;
        }

        public int ExecuteNonQuery(string sqlStr_Insert)
        {
            dbCmd.CommandText = sqlStr_Insert;

            int result = dbCmd.ExecuteNonQuery();

            return result;

        }
    }

7.启动 OWIN 主机,并使用 HttpClient 发出请求

将 Program.cs 文件中的所有样本代码替换为以下代码:

 class Program
    {
      
    
            static void Main(string[] args)
            {

                string baseAddress = "http://localhost:9000/";

                // Start OWIN host 

                using (WebApp.Start<Startup>(url: baseAddress))

                {
                    // Create HttpClient and make a request to api/values 

                    HttpClient client = new HttpClient();

                    var response = client.GetAsync(baseAddress + "api/values").Result;

                    Console.WriteLine(response);
                    Console.WriteLine(response.Content.ReadAsStringAsync().Result);
                    Console.ReadLine();

                }
            }
        }

最后附上一张项目图片:
在这里插入图片描述

8.下面开始测试代码

运行程序出现如下界面,此时可以看见接口已被隐藏,拒绝访问。
在这里插入图片描述

注意看图片Body内容,这是我数据库预存的账号密码,点击send按钮,如果你输入的body内容和你数据库中内容一样会自动生成token认证码,见下图:
在这里插入图片描述
如果你输入的账号密码不对,或者和你数据库中预存的账号密码不一致,则会返回空,见下图:
此处我的
下面尝试不添加token验证访问接口,可以看到接口拒绝访问。

在这里插入图片描述
添加token认证码后,成功访问接口,见下图:

在这里插入图片描述
本文基于微软官方文档进行编写,转载请注明出处。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 .NET Core Web API 中进行 Token 验证通常涉及以下步骤: 1. 安装 Microsoft.AspNetCore.Authentication.JwtBearer 包。 2. 在 Startup.cs 文件的 ConfigureServices() 方法中添加身份验证服务,包括 JWTBearerOptions 配置。 3. 在 Startup.cs 文件的 Configure() 方法中启用身份验证中间件。 以下是一个基本的示例: ```csharp using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.IdentityModel.Tokens; using System.Text; public void ConfigureServices(IServiceCollection services) { // 配置身份验证服务 services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = Configuration["Jwt:Issuer"], ValidAudience = Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:SecretKey"])) }; }); // 其他服务注册... } public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 启用身份验证中间件 app.UseAuthentication(); // 其他中间件注册... } ``` 上述代码中,我们使用了 `AddAuthentication()` 方法来配置身份验证服务,并指定了 JWTBearerDefaults.AuthenticationScheme 作为默认身份验证方案。 接着,我们使用 `AddJwtBearer()` 方法来配置 JWTBearerOptions,其中 `TokenValidationParameters` 属性用于指定 Token 验证参数,例如验证发行者、受众、过期时间、签名密钥等。 最后,在 Configure() 方法中,我们调用 `UseAuthentication()` 方法来启用身份验证中间件,以确保每个请求都进行身份验证。 ### 回答2: 在.NET Core Web API中配置Token验证,可以按照以下步骤进行操作: 1. 添加NuGet包:在项目中添加Microsoft.AspNetCore.Authentication和Microsoft.AspNetCore.Authentication.JwtBearer两个NuGet包。 2. 配置认证服务:在Startup.cs文件的ConfigureServices方法中添加以下代码,以启用Bearer令牌验证: ``` services.AddAuthentication(options => { options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme; options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme; }) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, // 验证发行人 ValidateAudience = true, // 验证受众 ValidateLifetime = true, // 验证生命周期 ValidateIssuerSigningKey = true, // 验证颁发的签名密钥 ValidIssuer = "your_issuer", // 设置发行人 ValidAudience = "your_audience", // 设置受众 IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key")) // 设置签名密钥 }; }); ``` 3. 配置授权:在Startup.cs文件的Configure方法中添加以下代码,以启用授权中间件: ``` app.UseAuthentication(); app.UseAuthorization(); ``` 4. 添加[Authorize]特性:在需要验证Token的Controller或Action上添加[Authorize]特性。 现在,当客户端请求受保护的Controller或Action时,将自动检查请求中的Token是否有效。如果Token验证失败,将返回401 Unauthorized状态码。如果验证成功,则可以继续处理请求。 ### 回答3: 在.NET Core WebAPI中配置Token验证主要涉及以下几个步骤: 1. 导入所需的包:首先,需要在`Startup.cs`文件中的`ConfigureServices`方法中导入所需的包。使用`Microsoft.AspNetCore.Authentication.JwtBearer`包来配置JWT验证。 2. 配置认证服务:在`ConfigureServices`方法中使用`services.AddAuthentication`来添加认证服务,并指定默认的身份验证方案。例如: ```csharp services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.RequireHttpsMetadata = false; // 是否要求HTTPS options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, // 验证发行者 ValidateAudience = true, // 验证接收者 ValidateLifetime = true, // 验证令牌有效期 ValidateIssuerSigningKey = true, // 验证签名 ValidIssuer = "your_issuer", ValidAudience = "your_audience", IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key")) }; }); ``` 在上述代码中,可以根据自己的需求调整参数值,如验证发行者、接收者、令牌有效期、签名等。 3. 应用认证中间件:在`Configure`方法中,使用`app.UseAuthentication()`来应用认证中间件。确保此代码位于路由中间件之前。例如: ```csharp app.UseAuthentication(); app.UseRouting(); app.UseAuthorization(); ``` 4. 使用`Authorize`特性:在需要进行Token验证的Controller或Action上,可以使用`Authorize`特性来标记,以进行访问控制。例如: ```csharp [Authorize] public class MyController : ControllerBase { // ... } ``` 5. 在请求中包含Token:最后,在发送请求时,需要在请求头中包含Bearer Token,以进行验证。例如: ``` Authorization: Bearer your_token ``` 通过以上配置,就可以在.NET Core WebAPI中实现Token验证。这样,当请求到达API时,API会验证Token的有效性,并对请求进行授权控制,确保只有拥有有效Token的用户可以访问受保护的资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值