如何在ASP.NET MVC中验证电子邮件是否来自特定域
本文关键字:是否 电子邮件 验证 ASP NET MVC | 更新日期: 2023-09-27 18:20:39
我正在构建一个应用程序,该应用程序最初将推广到特定的大学校园。
我想确保,当用户注册并提供他们的电子邮件地址时,这是他们学校提供的电子邮件,以确保只有合法学生才能访问该服务。
有人对如何做到这一点有什么榜样或想法吗?也许带有自定义验证属性?
注意:更具体地说,我只需要确保他们输入的电子邮件是.edu电子邮件地址
看起来regex是最好的选择。。。有人能为正确表达提供一些指导吗?
我将创建一个正则表达式属性和自定义DataAnnotation。在全局设置中的Application_Start下注册注释。然后,您可以在模型的客户端和服务器端使用验证作为DataAnnotation。我有一个RegularExpressAttributes.cs类,它包含了我常用的所有正则表达式;我所做的就是把它放进我的项目中。如果人们想要,就告诉我。
视图:
<div class="editor-field span-7">
@Html.LabelFor(model => model.EmailAddress)
@Html.EditorFor(model => model.EmailAddress)
@Html.ValidationMessageFor(model => model.EmailAddress)
</div>
正则表达式属性
using System;
using System.Collections.Generic;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;
namespace ProjectsMVC.Helpers
{
#region RegularExpressionAttributes
/// <summary>
/// Email validation regular expression attribute
/// </summary>
/// <remarks>Validates person@someplace.com, some.person@someplace.com, some_person@some+place.com and combinations thereof.</remarks>
public class ValidateEmailAttribute : RegularExpressionAttribute
{
// public ValidateEmailAttribute()
// : base(@"^'S?([0-9a-zA-Z]([-.'w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-'w]*[0-9a-zA-Z]'.)+[a-zA-Z]{2,9})$") { }
public ValidateEmailAttribute()
: base(@)@"^'S?([0-9a-zA-Z]([-.'w]*[0-9a-zA-Z])*@someplace.com$") {}
}
#region DataAnnotationsModelValidator
public class EmailValidator : DataAnnotationsModelValidator<ValidateEmailAttribute>
{
#region Properties
/// <summary>
/// Error message
/// </summary>
private readonly string _errorMessage;
/// <summary>
/// Regular expression pattern
/// </summary>
private readonly string _pattern;
#endregion
#region Constructors
/// <summary>
/// Initializes a new instance of the <see cref="EmailValidator"/> class.
/// </summary>
/// <param name="metaData">The meta data.</param>
/// <param name="context">The context.</param>
/// <param name="attribute">The attribute.</param>
public EmailValidator(ModelMetadata metaData, ControllerContext context, ValidateEmailAttribute attribute)
: base(metaData, context, attribute)
{
this._errorMessage = attribute.ErrorMessage;
this._pattern = attribute.Pattern;
}
#endregion
#region Methods
/// <summary>
/// Retrieves a collection of client validation rules.
/// </summary>
/// <returns>A collection of client validation rules.</returns>
public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
{
var rule = new ModelClientValidationRegexRule(this._errorMessage, this._pattern);
return new[] { rule };
}
#endregion
}
}
Global.ascx.cs
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
// Register custom model validators
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(ValidateEmailAttribute), typeof(EmailValidator));
}
最后是模型,User.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using ProjectsMVC.Helpers;
namespace ProjectsMVC.Models
{
[MetadataType(typeof(User_Validation))]
public partial class User
{
public string ProperName
{
get
{
return string.Format("{0} {1}", this.FirstName, this.LastName);
}
}
public string DirectoryName
{
get
{
return string.Format("{0}, {1}", this.LastName, this.FirstName);
}
}
public string IsUserActive
{
get
{
return Dictionaries.TrueOrFalse.First(t => t.Key == this.IsActive).Value.ToString();
}
}
}
public class User_Validation
{
[Display(Name = "eName")]
[Required(ErrorMessage = "required")]
[ValidateEname(ErrorMessage = "invalid")]
public string UserName { get; set; }
[Display(Name = "First DirectoryName")]
[Required(ErrorMessage = "required")]
public string FirstName { get; set; }
[Display(Name = "Last DirectoryName")]
[Required(ErrorMessage = "required")]
public string LastName { get; set; }
[Display(Name = "Email Address")]
[Required(ErrorMessage = "required")]
[ValidateEmail(ErrorMessage = "invalid")]
public string EmailAddress { get; set; }
[Display(Name = "Active User")]
[Required(ErrorMessage = "required")]
public bool IsActive { get; set; }
}
}
使用RegularExpressionAttribute并为您的特定域构造适当的正则表达式。
如果您正在寻找自定义验证器请参阅本文,它对MVC模型验证有很好的解释。
您应该使用正则表达式attibute作为模型中电子邮件字段的验证器。这在文章中也有解释。
自定义验证属性是你说的吗?以下是指南:http://msdn.microsoft.com/en-us/gg618485
如果用户属于特定的学院,则需要有特定的电子邮件后缀。您可以将其存储在表中,然后在用户登录系统时检查后缀根据学院的说法。
如果需要检查有效的电子邮件地址,可以使用正则表达式。
请参阅示例代码C#以检查有效的电子邮件。
Regex re = new Regex(@"'w.'w@{1,1}'w[.'w]?.'w");
return re.IsMatch(email);
存在RemoteAttribute
验证属性(RemoteAttribute类)。在其参数中,您可以指定控制器的动作,该动作可以进行验证过程。
理想情况下,我们可以有一个学校下拉列表,学生需要选择学校并输入电子邮件地址。
然后我们可以得到学校名称和电子邮件格式的映射。
school name - ABC
email format - ['w]+['.'-'_]?['w]+@ABC.[edu|org]
电子邮件格式可能因提供商而异。
这些东西可以是web.config 的一部分
<Web.config>
<appsettings>
<add key="ABC" value="['w]+['.'-'_]?['w]+@ABC.[edu|org]"/>
.
.
.
我们可以使用ConfigurationManager从配置中读取值。
此外,您的模型可以继承IValidatableObject并覆盖Validate方法来验证电子邮件地址,如果无效,则返回ValidationRessult,该结果可以在视图中显示为Validation Error