async validator(使用aspnet.identity 身份验证的框架中,怎么对现有用户进行删除)
本文目录
- 使用aspnet.identity 身份验证的框架中,怎么对现有用户进行删除
- iview中Select 选择器多选校验方法
- vue 表单验证 async-validator: [“xxx is not a string“]
- antd form表单validator 校验(4.17) 输入框一直是红色解决方法
- 表单异步验证js库:async-validator
- 如何使用 Web API 来对 MVC 应用程序进行身份验证
使用aspnet.identity 身份验证的框架中,怎么对现有用户进行删除
首先让我先更新 API 项目
我先 API 项目进行必要修改修改完再切换 Web 项目客户端进行更新
第1步:我需要数据库
能做任何操作前我需要先创建数据库本例使用 **L Server Express没安装载 **L Server Express安装完创建名 CallingWebApiFromMvc 数据库第步要做
Api 项目需要数据库连接字符串否则我寸步难行面段代码插入 Api 项目Web.config 文件:
认证(Identity)框架自创建我管理用户所需要员关系表现需要担提前创建
第2步:添加相关Nuget包
接我添加用于OWINWindows认证Nuget包打包管理控制台切换Api项目缺省项目输入命令:
Install-Package Microsoft.AspNet.WebApi.Owin
Install-Package Microsoft.Owin.Host.SystemWeb
Install-Package Microsoft.AspNet.Identity.EntityFramework
Install-Package Microsoft.AspNet.Identity.Owin
使用些包我应用启OWIN服务器通EntityFramework我用户保存**L Server
第3步:添加管理用户Identity类
我使用基于Windows认证机制Entity框架管理数据库相关业务首先我需要添加些用于处理类Api项目添加Identity目录作我要添加类命名空间添加类:
public class ApplicationUser : IdentityUser
{
}
public class ApplicationDbContext : IdentityDbContext
{ public ApplicationDbContext() : base("ApiFromMvcConnection") {}
public static ApplicationDbContext Create()
{ return new ApplicationDbContext();
}
}
注意我传给基类构造函数参数ApiFromMvcConnection要Web.config连接字符串name相匹配
public class ApplicationUserManager : UserManager
{ public ApplicationUserManager(IUserStore store) : base(store)
{
} public static ApplicationUserManager Create(IdentityFactoryOpti*** opti***, IOwinContext context)
{ var manager = new ApplicationUserManager(new UserStore (context.Get ()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator (manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
}; var dataProtectionProvider = opti***.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider = new DataProtectorTokenProvider (dataProtectionProvider.Create("ASP.NET Identity"));
} return manager;
}
}
第4步:添加OWIN启类
让我应用程序作OWIN服务器运行我需要应用程序启初始化我通启类做点我装点类
OwinStartup属性应用程序启触发意味着我摆脱Global.asax移
Application_Start代码转换我新启类
using Microsoft.Owin;
namespace Levelnis.Learning.CallingWebApiFromMvc.Api
{
using System;
using System.Web.Http;
using Identity;
using Microsoft.Owin.Security.OAuth;
using Owin;
using Providers;
public class Startup
{ public void Configuration(IAppBuilder app)
{
GlobalConfiguration.Configure(WebApiConfig.Register);
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext (ApplicationUserManager.Create); var oAuthOpti*** = new OAuthAuthorizationServerOpti***
{
TokenEndpointPath = new PathString("/api/token"),
Provider = new ApplicationOAuthProvider(),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
AllowInsecureHttp = true
};
// Enable the application to use bearer tokens to authenticate users
app.UseOAuthBearerTokens(oAuthOpti***);
}
}
}
应用程序启我建立自服务器我配置令牌端点并设置自自定义提供商我用我用户进行身份验证我例我使用ApplicationOAuthProvider类让我看看现:
第5步:添加OAuth提供商
public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
{ public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
context.Validated();
return Task.FromResult (null);
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
var userManager = context.OwinContext.GetUserManager ();
var user = await userManager.FindAsync(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect."); return;
}
var oAuthIdentity = await user.GenerateUserIdentityAsync(userManager, OAuthDefaults.AuthenticationType); var cookiesIdentity = await user.GenerateUserIdentityAsync(userManager, CookieAuthenticationDefaults.AuthenticationType); var properties = CreateProperties(user.UserName); var ticket = new AuthenticationTicket(oAuthIdentity, properties);
context.Validated(ticket);
context.Request.Context.Authentication.SignIn(cookiesIdentity);
}
private static AuthenticationProperties CreateProperties(string userName)
{
var data = new Dictionary
{
{
"userName", userName
}
};
return new AuthenticationProperties(data);
}
}
我兴趣2种第ValidateClientAuthentication验证客户端我客户端所返
功异步签名没异步调用发我离异步修改我必须返任务自我增加名
GenerateUserIdentityAsyncApplicationUser看起像:
public class ApplicationUser : IdentityUser
{ public async Task GenerateUserIdentityAsync(UserManager manager, string authenticationType)
{
var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
return userIdentity;
}
}
第6步:注册新用户 - API端
所我位所Identity类管理用户让我看看RegisterController新用户保存我数据库接受RegisterApi模式简单:
public class RegisterApiModel
{
public string Email { get; set; }
public string Password {
get; set;
}
public string ConfirmPassword { get; set; }
}
***本身注册功返200 OK响应验证失败则返401错误请求响应
public class RegisterController : ApiController
{ private ApplicationUserManager UserManager
{ get
{ return Request.GetOwinContext().GetUserManager ();
}
} public IHttpActionResult Post(RegisterApiModel model)
{ if (!ModelState.IsValid)
{ return BadRequest(ModelState);
} var user = new ApplicationUser
{
Email = model.Email,
UserName = model.Email,
EmailConfirmed = true
};
var result = UserManager.Create(user, model.Password);
return result.Succeeded ? Ok() : GetErrorResult(result);
}
private IHttpActionResult GetErrorResult(IdentityResult result)
{
if (result == null)
{
return InternalServerError();
}
if (result.Errors != null)
{
foreach (var error in result.Errors)
{
ModelState.AddModelError("", error);
}
}
if (ModelState.IsValid)
{
// No ModelState errors are available to send, so just return an empty BadRequest.
return BadRequest();
}
return BadRequest(ModelState);
}
}
iview中Select 选择器多选校验方法
iview提供的select组件中使用multiple属性可以开启多选模式,返回的数据也是数组的形式。
iview使用的校验是根据async-validator来实现数据验证。验证规则可前去查看开源项目
多选模式下的select组件校验使用type为array,可设置len属性来规定数组的长度,设置len:1则不是数组长度为1则通过校验,不设置则数组有元素则通过校验。
{
type:
’array’,
required:
true,
message:
’不能为空’}
正则可以写在data中
在rules中引用即可
以上这篇iview中Select
选择器多选校验方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。
您可能感兴趣的文章:完美解决iview
的select下拉框选项错位的问题
vue 表单验证 async-validator: [“xxx is not a string“]
使用iview动态添加表单校验,触发 this.$refs
组件写法如下:
c***ole错误提示如下:
去掉 :rules 规则中的 trigger 属性
再次触发 this.$refs.validate 方法校验的时候恢复正常。
未知
这种解决方法只是一种简单的临时解决方案,暂时不知道有没有别的问题。。。╮(╯▽╰)╭
antd form表单validator 校验(4.17) 输入框一直是红色解决方法
使用 antd 的 validator 方法时 用 antd 官方提供的示例会 导致输入框一直是红色
改用以下写法就好了
```
rules={[
{
validator: async function validator(_, value, callback) {
c***t res: any = await getCheckNumberUnique(value);//异步发送接口 给 后端进行校验
if (res && res.data && res.data.code === 500) {
throw new Error(’地图编号重复’);//错误信息
} else {
callback();//恢复为蓝色框
}
},
},
]}
```
表单异步验证js库:async-validator
***隐藏网址***
基本用法包括定义一个descriptor,将其分配给schema,并将要验证的对象和回调函数传递给schema创建出来的validator的validate方法:
该方法将返回Promise对象,如:
传递给validate或asyncvalidate的选项将传递给验证函数,以便您可以在验证函数中临时引用数据(例如模型引用)。但是,某些选项名是保留的;如果使用选项对象的这些属性,它们将被覆盖。保留的属性是消息、异常和错误。
针对单个字段测试多个验证规则通常很有用,这样可以使规则成为对象数组,例如:
要使用的验证程序的类型,识别的类型值如下:
boolean,是否必填
模式规则属性表示正则表达式,该值必须匹配才能通过验证。
使用min和max属性定义范围。对于字符串和数组类型,将根据长度进行比较,对于数字类型,数字不得小于min,也不得大于max。
验证字段的确切长度。对于字符串和数组类型,对length属性执行比较,对于数字类型,此属性指示数字的完全匹配,即,它可能仅严格等于len。如果len属性与最小和最大范围属性组合,则len优先。
枚举,要从可能值列表中验证值,请使用带有枚举属性的枚举类型,列出该字段的有效值。
空白,通常将仅包含空格的必填字段视为错误。要为仅包含空格的字符串添加其他测试,请将空白属性添加到值为true的规则。规则必须是字符串类型。
如果需要验证深层对象属性,则可以通过将嵌套规则分配给规则的fields属性来为对象或数组类型的验证规则执行此操作。
深度规则验证为嵌套规则创建架构,因此还可以指定传递给schema.validate()方法的选项。
父规则也会被验证,因此如果您有一组规则,例如:
并提供 {roles: } 这样的源对象,将会创建两个错误。一个用于数组长度不匹配,另一个用于索引2处缺少的必需数组项。
defaultField属性可与数组或对象类型一起使用,以验证容器的所有值。它可以是包含验证规则的对象或数组。例如:
有时需要在验证之前转换值,可能是为了强制价值或以某种方式对其进行消毒。为此,请将验证规则添加到转换有时需要在验证之前转换一个值,可能是强制值或以某种方式对其进行清理。为此,请向验证规则添加转换函数。该属性在验证之前被转换,并重新分配给源对象,以在适当的位置改变该属性的值。
如果没有转换函数,验证将失败,因为模式不匹配,因为输入包含前导空格和尾随空格,但通过添加转换函数验证传递,同时清理字段值。
消息,根据您的应用程序要求,您可能需要i18n支持,或者您可能更喜欢不同的验证错误消息。实现这一点的最简单方法是将消息分配给规则:
消息可以是任何类型,例如jsx格式。
消息也可以是一个函数,例如,如果使用vue-i18n:
对于不同的语言,可能需要相同的模式验证规则,在这种情况下,为每种语言复制模式规则是没有意义的。在这个场景中,您只需为该语言提供您自己的消息并将其分配给模式:
如果要定义自己的验证函数,最好将消息字符串分配给消息对象,然后通过验证函数内的opti***.messages属性访问消息。
异步验证器,您可以为指定字段自定义异步验证函数:function(rule, value, callback)
验证器,您可以为指定字段自定义验证函数:function(rule, value, callback)
如何使用 Web API 来对 MVC 应用程序进行身份验证
首先,让我们先更新 API 项目
我们将先对 API 项目进行必要的修改,修改完成之后再切换到 Web 项目对客户端进行更新。
第1步:我们需要一个数据库
在能做任何操作之前我们需要先创建一个数据库。本例中将使用 **L Server Express。如果你没有安装,可以从这里下载 **L Server Express。安装完成之后,创建一个名为 CallingWebApiFromMvc 的数据库。这就是第一步要做的。
Api 项目还需要一个数据库连接字符串,否则我们寸步难行。把下面这段代码插入到 Api 项目的Web.config 文件中:
《connectionStrings》
《add name="ApiFromMvcConnection" connectionString="Data Source=(local);Initial Catalog=CallingWebApiFromMvc;Integrated Security=True" providerName="System.Data.SqlClient" /》《/connectionStrings》
认证(Identity)框架会自动创建我们管理用户所需要的成员关系表,现在不需要担心去提前创建它们。
第2步:添加相关的Nuget包
接下来我们添加用于OWIN和Windows认证的Nuget包。打开包管理控制台,切换Api项目为缺省项目,输入以下命令:
Install-Package Microsoft.AspNet.WebApi.Owin
Install-Package Microsoft.Owin.Host.SystemWeb
Install-Package Microsoft.AspNet.Identity.EntityFramework
Install-Package Microsoft.AspNet.Identity.Owin
使用这些包可以在我们的应用中启动一个OWIN服务器,然后通过EntityFramework把我们的用户保存到**L Server。
第3步:添加管理用户的Identity类
我们使用基于Windows认证机制之上的Entity框架来管理数据库相关的业务。首先我们需要添加一些用于处理的类。在Api项目里添加一个Identity目录作为我们要添加类的命名空间。然后添加如下的类:
public class ApplicationUser : IdentityUser
{
}
public class ApplicationDbContext : IdentityDbContext《ApplicationUser》
{ public ApplicationDbContext() : base("ApiFromMvcConnection") {}
public static ApplicationDbContext Create()
{ return new ApplicationDbContext();
}
}
注意我们传给基类构造函数的参数ApiFromMvcConnection要和Web.config中的连接字符串中的name相匹配。
public class ApplicationUserManager : UserManager《ApplicationUser》
{ public ApplicationUserManager(IUserStore《ApplicationUser》 store) : base(store)
{
} public static ApplicationUserManager Create(IdentityFactoryOpti***《ApplicationUserManager》 opti***, IOwinContext context)
{ var manager = new ApplicationUserManager(new UserStore《ApplicationUser》 (context.Get《ApplicationDbContext》 ()));
// Configure validation logic for usernames
manager.UserValidator = new UserValidator《ApplicationUser》 (manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = true
};
// Configure validation logic for passwords
manager.PasswordValidator = new PasswordValidator
{
RequiredLength = 6,
RequireNonLetterOrDigit = true,
RequireDigit = true,
RequireLowercase = true,
RequireUppercase = true,
}; var dataProtectionProvider = opti***.DataProtectionProvider;
if (dataProtectionProvider != null)
{
manager.UserTokenProvider = new DataProtectorTokenProvider《ApplicationUser》 (dataProtectionProvider.Create("ASP.NET Identity"));
} return manager;
}
}
第4步:添加OWIN启动类
为了让我们的应用程序作为OWIN服务器上运行,我们需要在应用程序启动时初始化。我们可以通过一个启动类做到这一点。我们将装点这个类的
OwinStartup属性,因此在应用程序启动时触发。这也意味着,我们可以摆脱的Global.asax和移动它们的
Application_Start代码转换成我们新的启动类。
using Microsoft.Owin;
namespace Levelnis.Learning.CallingWebApiFromMvc.Api
{
using System;
using System.Web.Http;
using Identity;
using Microsoft.Owin.Security.OAuth;
using Owin;
using Providers;
public class Startup
{ public void Configuration(IAppBuilder app)
{
GlobalConfiguration.Configure(WebApiConfig.Register);
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext《ApplicationUserManager》 (ApplicationUserManager.Create); var oAuthOpti*** = new OAuthAuthorizationServerOpti***
{
TokenEndpointPath = new PathString("/api/token"),
Provider = new ApplicationOAuthProvider(),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
AllowInsecureHttp = true
};
// Enable the application to use bearer tokens to authenticate users
app.UseOAuthBearerTokens(oAuthOpti***);
}
}
}
在应用程序启动时,我们正在建立自己的服务器。在这里,我们配置令牌端点并设置自己的自定义提供商,我们用我们的用户进行身份验证。在我们的例子中,我们使用了ApplicationOAuthProvider类。让我们来看看现在:
第5步:添加OAuth的提供商
public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
{ public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
{
context.Validated();
return Task.FromResult《object》 (null);
}
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
var userManager = context.OwinContext.GetUserManager《ApplicationUserManager》 ();
var user = await userManager.FindAsync(context.UserName, context.Password);
if (user == null)
{
context.SetError("invalid_grant", "The user name or password is incorrect."); return;
}
var oAuthIdentity = await user.GenerateUserIdentityAsync(userManager, OAuthDefaults.AuthenticationType); var cookiesIdentity = await user.GenerateUserIdentityAsync(userManager, CookieAuthenticationDefaults.AuthenticationType); var properties = CreateProperties(user.UserName); var ticket = new AuthenticationTicket(oAuthIdentity, properties);
context.Validated(ticket);
context.Request.Context.Authentication.SignIn(cookiesIdentity);
}
private static AuthenticationProperties CreateProperties(string userName)
{
var data = new Dictionary《string, string》
{
{
"userName", userName
}
};
return new AuthenticationProperties(data);
}
}
我们感兴趣的是这里2种方法。第一,ValidateClientAuthentication,只是验证客户端。我们有一个客户端,所以返回成
功。这是一个异步方法签名但没有异步调用发生。正因为如此,我们可以离开了异步修改,但我们必须返回一个任务自己。我们增加了一个名为
GenerateUserIdentityAsync的ApplicationUser,它看起来像这样的方法:
public class ApplicationUser : IdentityUser
{ public async Task《ClaimsIdentity》 GenerateUserIdentityAsync(UserManager《ApplicationUser》 manager, string authenticationType)
{
var userIdentity = await manager.CreateIdentityAsync(this, authenticationType);
return userIdentity;
}
}
第6步:注册一个新用户 - API端
所以,我们有到位的所有Identity类管理用户。让我们来看看RegisterController,将新用户保存到我们的数据库。它接受一个RegisterApi模式,这是简单的:
public class RegisterApiModel
{
public string Email { get; set; }
public string Password {
get; set;
}
public string ConfirmPassword { get; set; }
}
***本身,如果注册成功只是返回一个200 OK响应。如果验证失败,则返回401错误请求的响应。
public class RegisterController : ApiController
{ private ApplicationUserManager UserManager
{ get
{ return Request.GetOwinContext().GetUserManager《ApplicationUserManager》 ();
}
} public IHttpActionResult Post(RegisterApiModel model)
{ if (!ModelState.IsValid)
{ return BadRequest(ModelState);
} var user = new ApplicationUser
{
Email = model.Email,
UserName = model.Email,
EmailConfirmed = true
};
var result = UserManager.Create(user, model.Password);
return result.Succeeded ? Ok() : GetErrorResult(result);
}
private IHttpActionResult GetErrorResult(IdentityResult result)
{
if (result == null)
{
return InternalServerError();
}
if (result.Errors != null)
{
foreach (var error in result.Errors)
{
ModelState.AddModelError("", error);
}
}
if (ModelState.IsValid)
{
// No ModelState errors are available to send, so just return an empty BadRequest.
return BadRequest();
}
return BadRequest(ModelState);
}
}