代码之家  ›  专栏  ›  技术社区  ›  BobTheBuilder

如何在ASP.NET MVC应用程序中附加自定义成员资格提供程序?

  •  5
  • BobTheBuilder  · 技术社区  · 16 年前

    如何将自定义成员资格提供程序与我的ASP.NET MVC[authorize()]属性绑定起来?关于如何创建自定义成员资格提供程序,我已经详细阅读了许多教程,但我所找到的有关如何将其连接到应用程序的所有信息似乎都围绕着常规的ASP.NET WebForms应用程序展开,而这些应用程序似乎是小菜一碟。

    我对ASP.NET MVC中出现的大量“魔力”感到困惑,这很好,但我习惯于以WebForms的方式插入内容,所以这种“它只是有效的”方法对我来说有点让人头脑发热。我怎么知道我什么时候应该做举重,或者我应该仅仅依靠魔法来完成?

    我应该在哪里将我的提供商连接到MVC应用程序?我是否正确地假设它是在我连接之后通过[authorize()]属性调用的?

    3 回复  |  直到 16 年前
        1
  •  6
  •   BenAlabaster    16 年前

    希望我能在其他答案的基础上再加上一些澄清,因为它们并不能解释正在发生的事情,这对你的困惑没有帮助。

    首先,实现您的自定义提供程序,从您已经做过的事情的声音来看,这样我只会抛出一个小代码片段,不会在这里进一步详细介绍:

    using System.Web.Security;
    
    public class MyCustomMembershipProvider : MembershipProvider
    {
        public override bool ValidateUser(string username, string password)
        {
            if (username.Equals("BenAlabaster") && password.Equals("Elephant"))
                return true;
    
            return false;
        }
    
        /* Override all the other methods required to extend MembershipProvider */        
    }
    

    然后在web.config中配置提供程序,确保填充配置基本成员身份提供程序的属性:

    <membership defaultProvider="MyCustomMembershipProvider">      
        <providers>        
            <clear />        
            <add name="MyCustomMembershipProvider" 
                 type="MyNamespace.MyCustomMembershipProvider" 
                 enablePasswordRetrieval="false"
                 enablePasswordReset="true"          
                 requiresQuestionAndAnswer="false"          
                 requiresUniqueEmail="true"           
                 passwordFormat="Hashed"           
                 maxInvalidPasswordAttempts="10"           
                 minRequiredPasswordLength="6"           
                 minRequiredNonalphanumericCharacters="0"           
                 passwordAttemptWindow="10"           
                 passwordStrengthRegularExpression=""           
                 applicationName="/" />      
        </providers>     
    </membership>
    

    下一点我认为你想得太多了,这就是你的web应用程序的实际连接。然而,在webforms应用程序中,你必须自己编写其余的代码-MVC框架为你编写其余的代码-你所需要做的就是将[authorize]属性添加到你的操作方法中,框架将检查你是否登录,如果没有重定向到登录页面。登录页面将找到您的自定义提供程序,因为这是web.config中配置的,并且将登录您的用户。您可以通过引用 用户 对象:

    public class WhateverController : Controller
    {
        [Authorize]
        public ActionResult WhateverAction()
        {
            ViewData["LoggedInAs"] = string.Format("You are logged in as {0}.", User.Identity.Name);
            Return View();
        }
    }
    

    因此,此操作要求用户登录,并将用户信息显示给页面上要显示的whatever/whateveration.aspx视图。

        2
  •  1
  •   twk    16 年前

    web.config中引用了我的自定义成员身份提供程序:

     <membership defaultProvider="MyMembershipProvider">
      <providers>
        <clear/>
        <add name="MyMembershipProvider" type="Namespace.MyMembershipProvider, Namespace" connectionStringName="connstring" [...] />
      </providers>
    </membership>
    

    然后只使用静态成员身份类。

        3
  •  0
  •   chobo2    16 年前

    你在这个定制会员资格上改了多少?就像你改变了表名?你能登录用户吗?你的会员制在工作吗?

    如果你改变了很多东西,比如你把角色表名改成了其他的或者类似的东西,那么你就必须重写authroize标签。

    但是,如果您的自定义成员身份不起作用,那么您可能没有正确配置它,并且配置与WebForms中的配置相同。你只需要设置你的webconfig。

      </authentication>
        <membership>
          <providers>
            <clear />
            <add name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ConnectionString"
             enablePasswordRetrieval="false"
             enablePasswordReset="true"
              requiresQuestionAndAnswer="false"
              requiresUniqueEmail="true"
               passwordFormat="Hashed"
               maxInvalidPasswordAttempts="10"
               minRequiredPasswordLength="6"
               minRequiredNonalphanumericCharacters="0"
               passwordAttemptWindow="10"
               passwordStrengthRegularExpression=""
               applicationName="/"  />
          </providers>
        </membership>
        <profile>
          <providers>
            <clear />
            <add name="AspNetSqlProfileProvider" type="System.Web.Profile.SqlProfileProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ConnectionString" applicationName="/" />
          </providers>
        </profile>
        <roleManager enabled="true">
          <providers>
            <clear />
            <add connectionStringName="ConnectionString"
              applicationName="/" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
            <add applicationName="/" name="AspNetWindowsTokenRoleProvider"
              type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
          </providers>
        </roleManager>
    
    推荐文章