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认证码后,成功访问接口,见下图:
本文基于微软官方文档进行编写,转载请注明出处。