如何在asp.net mvc身份上设置自定义身份validation?

我需要的?! 我有一个ASP.NET身份系统设置和外部登录运行。 无论出于何种原因,我需要在ASP.NET身份validation后设置自定义身份validation。 我来解释一下怎么样? 假设我有三个页面供用户查看我的应用程序,页面A,B,C。 谁可以查看Page A? 任何匿名用户都可以查看页面A. 谁可以查看页面A和B? 任何使用他/她的电子邮件和密码或外部登录创建帐户的用户。 谁可以查看Page A,B&C?

这是我想要设置自定义身份validation的地方。 任何使用他/她的电子邮件帐户或外部登录名创建帐户并且具有有效序列密钥的用户。 序列号? 我在ASP.NET身份中设置了一个类,如下所示:

public class UserDetails : IdentityUser { public virtual MembershipSerial MembershipSerial { get; set; } } public class MembershipSerial { [HiddenInput(DisplayValue=false)] public int Id { get; set; } [HiddenInput(DisplayValue=false)] public string Serial { get; set; } [Required] [Display(Name="Membership Serial")] public string SerialConfirmed { get; set; } } public class MyDbContext : IdentityDbContext { public MyDbContext() : base ("EFDbContext") { } public System.Data.Entity.DbSet MembershipSerial { get; set; } } 

如上所述,我在课堂上设置了三个属性。 字段ID用于序列号的ID,序列号是14个字母数字字母,由管理员输入,您可以看到它是一个不允许为空的隐藏字段。 字段SerialConfirmed也是一个14字母数字字母,用户将输入这些字母进行身份validation,以便在应用程序中执行某些特定任务。 整个概念是,应该推送登录用户进行第二种类型的身份validation,即身份validation与序列号。

我非常需要帮助,在线搜索并没有太多帮助。 如果您需要更多信息或尚不清楚,请不要犹豫,问我。 问候编辑:我先使用EF代码。 Dostdar

看起来自定义授权属性可行。 这是一个示例实现:

 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)] public class RequiresSerialValidationAttribute : AuthorizeAttribute { public override void OnAuthorization(AuthorizationContext filterContext) { bool hasValidSerial = false; if (filterContext.HttpContext.Request.IsAuthenticated) { string userName = filterContext.HttpContext.User.Identity.Name; if (!string.IsNullOrWhiteSpace(userName)) { string serial = string.Empty;// TODO: Retrieve user's previously authenticated serial, perhaps from Session or a cookie? if(!string.IsNullOrWhiteSpace(serial)) { var service = DependencyResolver.Current.GetService(); hasValidSerial = service.IsSerialValidForUser(userName, serial); } } } if (!hasValidSerial) { filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = "yourserialauthcontroller", action = "yourauthaction", area = string.Empty })); } else { base.OnAuthorization(filterContext); } } } 

您可以使用此属性修饰操作方法:

 [RequireSerialValidation] public ActionResult SomeAction() { } 

该属性将触发重定向到您的质询操作,您可以在其中提示用户输入序列号。 假设一切顺利,您将其序列存储在某处(Session可以在此处工作,或创建加密的cookie),然后重定向回原始操作。 在第二次尝试时,您已经validation了该操作是否被允许,因此不会发生重定向。

您的身份validation服务可以是您想要的任何服务。 在此示例中,我假设您正在使用依赖项注入,并且您已配置了全局依赖项解析程序。 鉴于此,您的IYourAuthService可能如下所示(省略其他方法):

 public IYourAuthService { bool IsSerialValidForUser(string userName, string serial); } 

像这样的实现:

 public YourAuthService : IYourAuthService { public bool IsSerialValidForUser(string userName, string serial) { using(var context = new YourEntityFrameworkDbContext()) { return context.Users.Any(u => u.UserName.Equals(userName, StringComparison.OrdinalIgnoreCase) && u.Serial.Equals(serial, StringComparison.OrdinalIgnoreCase)); } } } 

假设您的数据库中有一个名为User (或Users )的表, UserNameSerial是该表上的字段。 StringComparison.OrdinalIgnoreCase允许您对要尝试比较的字符串执行不区分大小写,不区分大小写的匹配。