Аутентификация и авторизация пользователей в системе ASP.NET MVC [закрыто]



каков наилучший метод авторизации/аутентификации пользователей в ASP.NET MVC?



Я вижу, что на самом деле есть два подхода:




  • используйте встроенный ASP.NET система авторизации.

  • используйте пользовательскую систему с моим собственным пользователем, разрешением, таблицами групп пользователей и т. д.


Я бы предпочел второй вариант, потому что пользователь является частью моей модели предметной области (и у меня ноль опыт работы с ASP.NET встроенный материал), но я бы действительно хотелось бы услышать, что люди делают в этой области.

692   6  

6 ответов:

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

некоторые статьи на тема:

http://msdn.microsoft.com/en-us/library/f1kyba5e.aspx

http://www.asp.net/learn/videos/video-189.aspx

http://www.15seconds.com/issue/050216.htm

http://davidhayden.com/blog/dave/archive/2007/10/11/CreateCustomMembershipProviderASPNETWebsiteSecurity.aspx

пойти с таможней. MembershipProvider слишком тяжелый на мой вкус. Да, это можно реализовать упрощенным способом, но тогда вы получите очень неприятный запах NotSupportedException или NotImplementedException.

с полностью пользовательской реализацией вы все еще можете использовать IPrincipal, IIdentity и FormsAuth. И действительно, насколько сложно сделать свою собственную страницу входа и тому подобное?

самый простой способ-использовать asp.net имена пользователей как имена ролей. Вы можете написать свой собственный атрибут authorizarion для обработки авторизации:

public class CustomAuthorizationAttribute:AuthorizeAttribute
{
    public CustomAuthorizationAttribute():base()
    {
        Users = "registereduser";
    }
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        //You must check if the user has logged in and return true if he did that.
        return (bool)(httpContext.Session["started"]??false); 

    }
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        filterContext.HttpContext.Response.Redirect("SessionManagement/Index/?returningURL=" + 
            filterContext.HttpContext.Server.UrlEncode(filterContext.HttpContext.Request.Url.ToString()));

    }

}

код должен обрабатывать AuthorizeCore для возврата true, если пользователь запустил сеанс, и HandleUnauthorizedRequest для перенаправления пользователя на страницу входа в систему (опционально вы можете прикрепить возвращаемый url).

в то время методы контроллера, которые нуждаются в авторизации, установите атрибут более они:

public class SecretPageController {
    [CustomAuthorizationAttribute]
    ActionResult Index() {
        //Method that requires authorization
        return View();
    }

}

также установите метод авторизации в "формы" в веб-конфигурации.

Web.config:

  <authentication>
      <forms timeout="120"></forms>
  </authentication>
:
public SessionManagementController:Controller {
    public ActionResult Index(string returningURL)
    {
        return View("Index", new SessionModel() { ReturningURL = returningURL});
    }
    [HttpPost]        
    public ActionResult Index(SessionModel mod)
    {
        if (UserAuthenticated(mod.UserName, mod.Password))
        {
            FormsAuthentication.SetAuthCookie("registereduser", false);
            if (mod.UrlRetorno != null)
            {
                return Redirect(mod.ReturningURL);                    
            }
            return RedirectToAction("Index", "StartPage");
        }
        mod.Error = "Wrong User Name or Password";
        return View(mod);
    }
    bool UserAuthenticated(string userName, string password) {
       //Write here the authentication code (it can be from a database, predefined users,, etc)
        return true;
    }

    public ActionResult FinishSession()
    {
        HttpContext.Session.Clear();//Clear the session information
        FormsAuthentication.SignOut();
        return View(new NotificacionModel() { Message = "Session Finished", URL = Request.Url.ToString() });
    }

}

в контроллере, когда пользователь вводит свое имя пользователя и пароль, установите для файла cookie проверки подлинности форм значение TRUE (FormsAuthentication.SetAuthCookie ("registereduser", true)), сигнализируя имя пользователя (registereduser в примере) для проверки подлинности. Затем пользователь выходит, говорит ASP.NET для этого звоните Метод formsauthentication.Выход ().

модель:

class SessionModel {
    public string UserName {get;set;}
    public string Password {get;set;}
    public string Error {get;set;}
}  

используйте модель для хранения пользовательских данных.

вид (который представляет тип SessionModel):

        <div class="editor-label">
            <%: Html.LabelFor(model => model.UserName) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.UserName) %>
            <%: Html.ValidationMessageFor(model => model.UserName) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(model => model.Password) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.Password) %>
            <%: Html.ValidationMessageFor(model => model.Password) %>
        </div>
        <div class="field-validation-error"><%:Model==null?"":Model.Error??"" %></div>
        <%:Html.HiddenFor(model=>model.ReturningURL) %>
        <input type="submit" value="Log In" />

использовать для получения данных. В этом примере существует скрытое поле для хранения возвращаемого URL

Я надеюсь, что это помогает (мне пришлось перевести код, поэтому я не уверен, что это 100% правильно).

еще один подход заключается в использовании ASP.NET членство для проверки подлинности, свяжите свой класс пользователя ASP.NET члены и используйте свой класс пользователя для более подробных разрешений. Мы делаем это, потому что это позволяет очень легко менять поставщиков аутентификации, сохраняя при этом возможность иметь сложную систему разрешений.

В общем, стоит помнить, что аутентификация/идентификация и хранение разрешений не обязательно одна и та же проблема.

возможно, вас заинтересует вашего бизнеса на бесплатный API для авторизации пользователей

http://blog.maartenballiauw.be/post/2009/07/27/Authenticating-users-with-RPXNow-(in-ASPNET-MVC).aspx

попробуйте ASP.Net MVC членство стартовый комплект для административного API

скриншоты

http://www.squaredroot.com/2009/08/07/mvcmembership-release-1-0/

старый наборы изменений локаций (исторические)

http://mvcmembership.codeplex.com/SourceControl/list/changesets

Новый Адрес:

http://github.com/TroyGoode/MembershipStarterKit

Это четвертый подход. Используя классы безопасности веб-матрицы вы можете использовать простой поставщик членства, который может использовать EF, чтобы пользователи и роли могли быть частью вашей модели домена, а также частью помощников IPrincipal и IIdentity MVC.

Я создал пример проекта Github чтобы увидеть, как это может быть использовано с автоматической самостоятельной регистрации и электронной почты регистрации / сброса пароля и тому подобное.

Comments

    Ничего не найдено.