2009-10-31 4 views
5

Jak powiązać mojego dostawcę członkostwa niestandardowego z moim atrybutem ASP.NET MVC [Authorize()]? Przekonałem się przez kilka samouczków, jak utworzyć niestandardowego dostawcę członkostwa, ale wszystkie informacje, które znalazłem o tym, jak podłączyć go do aplikacji wydaje się obracać wokół regularnych aplikacji ASP.NET WebForms, które wydają się być częścią ciasta.Jak mogę dołączyć niestandardowego dostawcę członkostwa do mojej aplikacji ASP.NET MVC?

I'm unstuck z ilością "magii", która właśnie dzieje się w ASP.NET MVC, co jest świetne, ale jestem przyzwyczajony do podłączania rzeczy w sposób WebForms więc ta "to po prostu działa" metodologia jest trochę dla mnie giętka umysłu. Skąd mam wiedzieć, kiedy mam wykonać ciężki lifting lub mam polegać tylko na magii?

Gdzie mogę związać mojego dostawcę z aplikacją MVC? Czy mam rację zakładając, że jest wywoływany za pomocą atrybutu [Authorize()], gdy już go podłączę?

Odpowiedz

6

Mam nadzieję, że mogę dodać trochę dodatkowych wyjaśnień w stosunku do innych odpowiedzi, ponieważ one naprawdę nie wyjaśniają, co się dzieje, co nie pomoże wam w pomieszaniu.

Najpierw, wdrożyć dostawcy niestandardowej, która od głosu rzeczy zrobiłeś już, więc ja po prostu rzucać trochę fragment kodu i nie przejdzie do dalszych szczegółów tutaj:

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 */   
} 

Następnie należy skonfigurować dostawcę w web.config upewniając się, aby zapełnić atrybuty skonfigurować MembershipProvider Base:

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

następny nieco myślę jesteś overthinking rzeczywista tie-in do aplikacji internetowej . Natomiast w aplikacji WebForms trzeba samemu zakodować resztę - struktura MVC robi resztę - wszystko, co musisz zrobić, to dodać atrybut [Authorize] do swojej metody działania, a framework sprawdzi, czy jesteś ponownie zalogowany, a jeśli nie przekieruje Cię do strony logowania. Strona logowania znajdzie się z dostawcą niestandardową bo to co skonfigurowane w pliku web.config i zanotuje użytkownikowi można uzyskać informacje na temat zalogowanego użytkownika z kontrolerów poprzez odwołanie do użytkownika obiektu.

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

Ta czynność wymaga zalogowania użytkownika i przedstawienia informacji o użytkowniku w widoku Whatever/WhateverAction.aspx wyświetlanym na stronie.

+0

Okay, to ma sens - dzięki za wyczyszczenie tego. Po prostu nie robiłem dwóch razem. Nadal utknąłem w tym umyśle WebForms i nie zorientowałem się, kiedy MVC robi to dla mnie i kiedy muszę sobie z tym poradzić. – BobTheBuilder

0

Ile zmieniłeś w tym niestandardowym członkostwie? Jak zmieniłeś nazwy stołów? Czy możesz logować użytkowników i takie tam? Czy Twoje niestandardowe członkostwo działa?

Jeśli zmieniłeś wiele rzeczy w taki sposób, jak zmieniłeś nazwę tabeli ról na coś innego lub coś w tym stylu, to musisz zastąpić tag Authroize.

Jeśli jednak niestandardowe członkostwo nie działa, prawdopodobnie nie skonfigurowałeś go poprawnie, a konfigurowanie jest takie samo, jak w przypadku formularzy internetowych. Musisz tylko skonfigurować swój 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> 
+0

Kiedy mówisz - "co zmieniliśmy i tak dalej", nie zmieniliśmy niczego, używamy istniejącej bazy użytkowników, a nie tej, którą kreator ASP.NET MVC skonfiguruje dla Ciebie .. i szczerze mówiąc, nie mamy zamiaru korzystać z samouczka, jest to o wiele bardziej złożone niż to konieczne dla naszych potrzeb i nie spełnia wymagań naszego modelu biznesowego. Napisaliśmy więc dostawcę członkostwa ... rzeczą, o której nie mam pojęcia jest to, w jaki sposób podpina ona mojego niestandardowego dostawcę, który określiłem w web.config do kodu mojej aplikacji internetowej? – BobTheBuilder

+0

Cóż, wszystko, co ci dałem, to to, czego używasz do ustawiania niestandardowej bazy danych z dostawcą niestandardowym. Czy możesz wymienić tabele, których używasz, tak jak używasz aspnet_UserInRoles? aspnet_user i dowolna tabela z prefiksem z aspnet? – chobo2

1

Mam zwyczaj dostawca członkostwa jest wymieniony w pliku web.config:

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

Następnie wystarczy użyć statycznej klasy członkostwa.

+0

Fajnie - co Cię zatrzyma, określając wielokrotności w pliku web.config, a także w jaki sposób miejsce w mojej aplikacji internetowej uruchamia je? – BobTheBuilder

+0

Jesteś w stanie określić wielu dostawców członkostwa. Z tego powodu musisz określić defaultProvider. Czuję, że użyteczność wielu dostawców jest widoczna tylko w złożonych mechanizmach autoryzacji. Aby jednak wyświetlić listę dostawców w kodzie, wystarczy użyć właściwości System.Web.Security.Membership.Providers, która zwraca kolekcję dostawców członkostwa określoną w pliku web.cofig. – zowens

+0

jak napisał zowens. W rzeczywistości można utworzyć instancję własnego znanego dostawcy właśnie przez normalne MembershipProvider mp = new MyMembershipProvider(); lub przez pobranie z listy zwróconej przez Membership.Providers – twk

Powiązane problemy