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

时间:2009-10-31 19:38:33

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

如何将自定义成员资格提供程序与ASP.NET MVC [Authorize()]属性绑定?我已经通过一些关于如何创建自定义成员资格提供程序的教程进行了大肆宣传,但是我发现的有关如何将其连接到应用程序的所有信息似乎都围绕着常规的ASP.NET WebForms应用程序,这些应用程序看起来像是一块蛋糕。

我正在努力解决刚刚在ASP.NET MVC中发生的大量“魔术”,这很棒,但我习惯以WebForms的方式插入内容,所以这个“它只是工作”的方法是一个对我来说有点弯曲。我怎么知道什么时候我应该做那么繁重的事情,或者我应该只依靠魔法发生呢?

我在哪里将我的提供商绑定到MVC应用程序?我是否正确地假设一旦我把它连接起来就通过[Authorize()]属性调用它?

3 个答案:

答案 0 :(得分:6)

希望我能为其他答案增加一些额外的清晰度,因为他们真的无法解释发生了什么事情,这无助于你的混乱。

首先,根据您已经完成的事情的声音实现您的自定义提供程序,因此我只是抛出一些代码片段,并且不会在此处进一步详细说明:

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中配置提供程序,确保填充配置基本MembershipProvider的属性:

<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>

下一点,我认为你正在过度思考,与你的网络应用程序的实际搭配。而在WebForms应用程序中,您必须自己编写其余的代码 - MVC框架为您完成剩下的工作 - 您需要做的就是在您的操作方法中添加[Authorize]属性,框架将检查您是否'重新登录,如果没有重定向到登录页面。登录页面将找到您的自定义提供程序,因为这是在web.config中配置的并将用户登录。您可以通过引用用户对象从控制器访问有关登录用户的信息:< / p>

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

因此,此操作要求用户登录并将用户信息显示在页面上显示的Whatever / WhateverAction.aspx视图中。

答案 1 :(得分:1)

我的自定义成员资格提供程序在web.config中引用:

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

然后只使用静态Membership类。

答案 2 :(得分:0)

您在这个自定义会员资格中有多少变化?就像你改变表名一样?你能记录用户和东西吗?即你的自定义会员资格吗?

如果你改变了很多东西,比如你将角色表名改为不同的东西或类似的东西,那么你将不得不覆盖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>