Как я могу подключить пользовательский поставщик членства в моем приложении ASP.NET MVC? - PullRequest
5 голосов
/ 31 октября 2009

Как связать моего настраиваемого поставщика членства с моим атрибутом ASP.NET MVC [Authorize ()]? Я пробежал ряд руководств по созданию пользовательского поставщика членства, но вся информация, которую я нашел о том, как подключить его к приложению, похоже, вращается вокруг обычных приложений ASP.NET WebForms, которые кажутся частью торта.

Я расстаюсь с количеством "магии", которая просто случается в ASP.NET MVC, и это здорово, но я привык подключать что-либо в WebForms, так что методология "это просто работает" немного ума для меня. Откуда мне знать, когда я должен выполнять тяжелую работу, или я должен полагаться только на то, что это происходит магией?

Где мне привязать моего провайдера к приложению MVC? Прав ли я, предполагая, что он вызывается через атрибут [Authorize ()], как только я его подключу?

Ответы [ 3 ]

6 голосов
/ 03 ноября 2009

Надеюсь, я смогу добавить некоторую дополнительную ясность к другим ответам, так как они действительно не объясняют, что происходит, и это не поможет вам запутаться.

Прежде всего, внедрите своего собственного провайдера, который, исходя из того, что вы уже сделали, поэтому я просто добавлю небольшой фрагмент кода и не буду вдаваться в подробности:

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, и войдет в систему вашего пользователя. Вы можете получить доступ к информации о зарегистрированном пользователе из ваших контроллеров, ссылаясь на объект Пользователь :

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

Таким образом, для выполнения этого действия требуется, чтобы пользователь вошел в систему и представил информацию о пользователе в представлении Wh what / WhwhatAction.aspx, которое будет отображаться на странице.

1 голос
/ 31 октября 2009

Ссылка на мой пользовательский поставщик членства указана в файле web.config:

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

Тогда просто используйте статический класс Membership.

0 голосов
/ 31 октября 2009

Сколько вы изменили в этом пользовательском членстве? Как вы меняли имена таблиц? Можете ли вы войти в систему и прочее? Т.е. работает ли ваше пользовательское членство?

Если вы изменили много вещей, например, изменили имя таблицы ролей на что-то другое или что-то в этом роде, вам придется переопределить тег Authroize.

Однако, если ваше пользовательское членство не работает, вы, вероятно, не настроили его правильно, и настройка такая же, как в веб-формах. Вам просто нужно настроить веб-конфигурацию.

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