当前位置 : 主页 > 网络编程 > 其它编程 >

NancyFx2.0的开源框架的使用Stateless

来源:互联网 收集:自由互联 发布时间:2023-07-02
同样和前面一样新建一个空的Web项目,都在根目录添加Module,Models,Views文件夹添加Nuget包在Models文件夹里面添加UserModel类在Models文件夹 同样和前面一样新建一个空的Web项目,都在根目录
同样和前面一样新建一个空的Web项目,都在根目录添加Module,Models,Views文件夹添加Nuget包在Models文件夹里面添加UserModel类在Models文件夹

同样和前面一样新建一个空的Web项目,都在根目录添加Module,Models,Views文件夹

技术分享

添加Nuget包

技术分享

在Models文件夹里面添加UserModel类

public string Username { get; set; } public UserModel(string username) { Username = username; }

技术分享

在Models文件夹里面添加Userdatabase类

static readonly List ActiveApiKeys = new List(); private static readonly List User = new List(); static UserDatabase() { User.Add(new Tuple("Lexan","password")); User.Add(new Tuple("User","password")); } public static ClaimsPrincipal GetUserFromApiKey(string apiKey) { var activeKey = ActiveApiKeys.FirstOrDefault(x=>x.Item2==apiKey); if (activeKey==null) { return null; } var userRecord = User.First(x=>x.Item1==activeKey.Item1); return new ClaimsPrincipal(new GenericIdentity(userRecord.Item1,"Lexan")); } public static string ValidateUser(string username,string password) { //尝试从 "数据库" 中获取与给定用户名和密码匹配的用户 var userRecord = User.FirstOrDefault(x=>x.Item1==username if (userRecord==null) { return null; } //既然用户已被验证, 请创建一个可用于后续请求的 api 密钥。 var apiKey = Guid.NewGuid().ToString(); ActiveApiKeys.Add(new Tuple(username,apiKey)); return apiKey; } public static void RemoveApiKey(string apiKey) { var apiKeyToRemove = ActiveApiKeys.First(x=>x.Item2==apiKey); ActiveApiKeys.Remove(apiKeyToRemove); } public static Tuple CreateUser(string username, string password) { var user = new Tuple(username,password); User.Add(user); return user; }

技术分享

在Module文件夹中添加AuthModule类,如下代码

public class AuthModule:NancyModule { //post ["/login"] 方法主要用于获取后续调用的 api 密钥 public AuthModule():base("/auth/") { Post("/", Lexan => { var apiKey = UserDatabase.ValidateUser((string) this.Request.Form.Username, (string)this.Request.Form.Password); return string.IsNullOrEmpty(apiKey) ? new Response { StatusCode = HttpStatusCode.Unauthorized } : this.Response.AsJson(new { ApiKey=apiKey}); }); //销毁关键api 密钥 Delete("/",Lexan=> { var apiKey = (string)this.Request.Form.ApiKey; UserDatabase.RemoveApiKey(apiKey); return new Response { StatusCode=HttpStatusCode.OK}; }); }

技术分享

在Module文件下添加RootModule类

public RootModule() { Get("/",Lexan=>this.Response.AsText( "这是一个 rest api,它是在另一个 vs 项目" + "演示一个普通的 rest api 在" + "从其他网站或应用程序访问它" + "了解网站如何访问此 api, 运行" + "Stateless.Web项目"+ "和构建Web同一项目中" )); }

技术分享

在Module文件夹下添加SecureModule类

public SecureModule() { Get("secure",Lexan=> { var identity = this.Context.CurrentUser; var userModel = new UserModel(identity.Identity.Name); return this.Response.AsJson( new { SecureContent= "下面是一些安全的内容, 只能看到你提供了正确的 apikey", User=userModel }); }); Post("/secure/creat_user",Lexan=> { Tuple user = UserDatabase.CreateUser(this.Context.Request.Form["username"], this.Context.Request.Form["password"]); return this.Response.AsJson(new { username=user.Item1}); }); }

技术分享

继续在根目录添加StatelessBootstrapper

protected override void RequestStartup(TinyIoCContainer container, IPipelines pipelines, NancyContext context) { //在请求启动时, 我们修改请求管线 //包括无状态身份验证 //配置无状态身份验证很简单。只需使用 //NancyContext 得到 apiKey。然后, 使用 apiKey 获取 //用户的身份。 //// base.RequestStartup(container, pipelines, context); var cOnfiguration= new StatelessAuthenticationConfiguration(nancyCOntext=> { var apiKey = (string)nancyContext.Request.Query.ApiKey.Value; return UserDatabase.GetUserFromApiKey(apiKey); }); AllowAccessToConsumingSite(pipelines); StatelessAuthentication.Enable(pipelines,configuration); } static void AllowAccessToConsumingSite(IPipelines pipelines) { pipelines.AfterRequest.AddItemToEndOfPipeline(x => { x.Response.Headers.Add("访问-控制-允许-起源", "*"); x.Response.Headers.Add("访问-控制允许-方法", "开机自检、获取、删除、放入、选项"); }); }

技术分享

再来看看运行的结果

技术分享

成功了,谢谢欣赏!

【文章原创作者:大丰网页开发 http://www.1234xp.com/dafeng.html 处的文章,转载请说明出处】

上一篇:引用封装函数方法
下一篇:没有了
网友评论