0

这是对此处问题的跟进,其中答案似乎是指过于复杂和过于具体(EF,我没有使用 - 甚至没有使用 ORM)。

必须有一种比答案中暗示的烟雾、镜子和巫术更直接的方法来解决这种常见情况。

注意:我将“context”括在括号中,因为我没有使用 EF,所以它不是我在这里谈论的字面“dbcontext”。

所以我想知道:当用户通过身份验证和授权时,我可以为每个会话设置一个全局变量吗?

例如,当用户通过身份验证/授权时,我会知道应该为他提供哪些数据库上下文/内容。

因此,我似乎可以在 Global.asax.cs 的 Application_Start() 方法中设置一个值,然后更改 RepositoriesInstaller(实现 IWindsorInstaller)类以根据用户和他应该拥有的数据有条件地注册不同的具体存储库或放置条件代码在具体的存储库本身中使用这个或那个数据库实例。

这可行吗?一种方法(更改 RepositoriesInstaller / 更改具体的 Repositories 类)是首选吗?

4

1 回答 1

1

看看这个答案,它将向您展示如何根据键或值解析正确的存储库。

如果要与授权用户一起存储,则需要对数据进行简单的序列化,并将其存储在经过身份验证的 cookie 中:

创建一个模型来表示登录信息:

public class AuthenticatedMember
{
    public Guid Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public int SiteNumber { get; set; }
}

在控制器中执行类似登录的操作:

var authenticatedMember = MembershipManager.ValidateLogin(model.Email, model.Password);

var cookie = FormsAuthentication.GetAuthCookie(authenticatedMember.Id.ToString(), false);
var ticket = FormsAuthentication.Decrypt(cookie.Value);

var newTicket = new FormsAuthenticationTicket(ticket.Version, ticket.Name, ticket.IssueDate, ticket.Expiration, ticket.IsPersistent, authenticatedMember.ToJson(), ticket.CookiePath);

cookie.Value = FormsAuthentication.Encrypt(newTicket);
Response.Cookies.Add(cookie);

然后在需要时使用模型绑定器反序列化 AuthenticatedMember:

public class AuthenticatedMemberModelBinder : IModelBinder
{
    #region IModelBinder Members

    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        if (bindingContext.Model != null)
        {
            throw new InvalidOperationException("Cannot update instances");
        }

        if (controllerContext.RequestContext.HttpContext.Request.IsAuthenticated)
        {
            var cookie = controllerContext
                .RequestContext
                .HttpContext
                .Request
                .Cookies[FormsAuthentication.FormsCookieName];

            if (null == cookie)
                return null;

            var decrypted = FormsAuthentication.Decrypt(cookie.Value);

            if (!string.IsNullOrEmpty(decrypted.UserData))
            {
                return JsonConvert.DeserializeObject<AuthenticatedMember>(decrypted.UserData);
            }
        }
        return null;
    }

    #endregion
}
于 2014-01-29T22:30:26.937 回答