【问题标题】:How Can I Validate that an Email is from a Particular Domain in ASP.NET MVC?如何验证电子邮件是否来自 ASP.NET MVC 中的特定域?
【发布时间】:2012-01-16 16:06:47
【问题描述】:

我正在构建一个应用程序,该应用程序最初将推广到特定的大学校园。

我想确保,当用户注册并提供他们的电子邮件地址时,这是他们学校提供的电子邮件,以确保只有合法学生才能访问该服务。

有没有人有任何关于如何做到这一点的例子或想法?也许带有自定义验证属性?

注意: 更具体地说,我只需要确保他们输入的电子邮件是 .edu 电子邮件地址

看起来正则表达式是要走的路...谁能提供一些关于正确表达的指导?

【问题讨论】:

  • 您要验证实际域是否存在或只是以 .edu 结尾?
  • 以 .edu 结尾很可能就足够了。我想另一种选择是将域存储在我的数据库中并进行检查。
  • 有没有使用正则表达式快速检查 .edu 的方法?

标签: c# asp.net .net asp.net-mvc asp.net-mvc-3


【解决方案1】:

我会创建一个正则表达式属性和自定义 DataAnnotation。在 Global.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; }
    }
}

【讨论】:

    【解决方案2】:

    使用RegularExpressionAttribute 并为您的特定域构造适当的正则表达式。

    【讨论】:

      【解决方案3】:

      如果您正在寻找自定义验证器,请参考this article,它对 MVC 模型验证有很好的解释。

      您应该使用正则表达式属性作为模型中电子邮件字段的验证器。这在文章中也有解释。

      【讨论】:

        【解决方案4】:

        你说的自定义验证属性?这是一个指南:http://msdn.microsoft.com/en-us/gg618485

        【讨论】:

          【解决方案5】:

          如果用户属于特定的大学需要有特定的电子邮件后缀。 您可以将其存储在表中,然后在用户登录系统时检查后缀 根据学院。

          如果您需要检查有效的电子邮件地址,您可以使用正则表达式。

          查看示例代码 C# 以检查有效的电子邮件。

            Regex re = new Regex(@"\w.\w@{1,1}\w[.\w]?.\w");
                      return re.IsMatch(email);
          

          【讨论】:

          • 我如何修改它以验证电子邮件是否以 int ".edu" 结尾?
          【解决方案6】:

          RemoteAttribute 验证属性(RemoteAttribute Class)。 在其参数中,您可以指定可以执行验证过程的控制器操作。

          【讨论】:

            【解决方案7】:

            理想情况下,我们可以有一个学校下拉菜单,学生需要选择学校并输入电子邮件地址。

            然后我们可以有学校名称和电子邮件格式的映射。

            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,它可以在视图中显示为验证错误

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2012-08-23
              • 2015-05-16
              • 1970-01-01
              • 2013-12-13
              • 1970-01-01
              • 2018-04-30
              • 2017-02-27
              • 2011-03-03
              相关资源
              最近更新 更多