如何在MVC应用程序中使用RavenDb实现身份验证和授权?

Phi*_*ler 6 authentication asp.net-mvc authorization ravendb

虽然我已经习惯使用标准的ASP.Net成员资格提供程序来创建新的MVC Web应用程序,但我最近一直在使用RavenDb,但我仍然不相信我已经掌握了实施的最佳实践用户身份验证和角色授权.

我在AccountController中替换我的Register和Logon方法的代码如下所示:

[HttpPost]
public ActionResult Register(RegisterModel model)
{
    if (ModelState.IsValid)
    {
    using (IDocumentSession Session = DataDocumentStore.Instance.OpenSession())
    {
        Session.Store(new AuthenticationUser
        {
            Name = Email,
            Id = String.Format("Raven/Users/{0}", Name),
            AllowedDatabases = new[] { "*" }
        }.SetPassword(Password));
        Session.SaveChanges();
        FormsAuthentication.SetAuthCookie(model.UserName, createPersistentCookie: false);
        // ...etc. etc.


    [HttpPost]
    public JsonResult JsonLogOn(LogOnModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            using (IDocumentSession Session = DataDocumentStore.Instance.OpenSession())
            {
                book Ok = Session.Load<AuthenticationUser>(String.Format("Raven/Users/{0}", Username)).ValidatePassword(Password);
                FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
                // etc...
Run Code Online (Sandbox Code Playgroud)

我见过很多人在类似的帖子或问题中引用的RavenDb成员资格提供者代码,但似乎也有很多人认为这个代码超过了顶层并且利用效率低下的API来存储数据存储不需要其中提供的大部分内容.

那么RavenDb身份验证的最佳架构/设计策略是什么(不是OAuth,而是表单身份验证),我是不是在咆哮着正确的树?

Wya*_*ett 2

我认为这个问题有几个部分。首先,从 MVC 项目的角度来看,您确实希望使用能够与 AuthorizationAttribute 配合使用的东西。这实际上并不需要使用 MembershipProvider 本身,而是将适当的 IPrincipal 填充到 HttpContext.Current.User 中,因为这些属性就是通过这些属性来授权事物的。

从 HTTP 的角度来看,利用现有的表单身份验证基础设施也很有意义——它解决了您实际上不应该自己解决的大多数棘手的安全问题,并且在使用您提供的内容方面非常灵活。

从这里你就明白了问题的要点——你想如何从数据的角度支持你的身份验证系统。我认为这是一个非常有策略的决定——某些应用程序仅使用 MembershipProvider 样式模型可能是有意义的。但是,如果我有一个非常以用户为中心的应用程序,其中存储了大量用户数据,我可能会考虑根据我的要求滚动自定义用户存储。如果您使用的是身份验证捆绑包,您也可以在某种程度上使用它。但我认为目前没有硬性规定——做对你的应用程序有意义的事情。

您不应该做的一件事是使用上面的 AuthenticationUser —— 这是针对数据库系统用户的。用 SQL Server 术语来说,这就像将应用程序中的每个用户都设为 SQL 用户,然后对其进行身份验证。这就是一些旧的内联网产品过去的工作方式,但现在世界已经不再那样了。