【问题标题】:ASP.Net MVC per area membership每个区域成员的 ASP.Net MVC
【发布时间】:2010-04-30 19:44:14
【问题描述】:

我正在构建一个 ASP.Net MVC 应用程序,它将在共享主机帐户上运行以托管多个域。我从包含成员资格的默认模板开始,并为每个域创建了一个 mvc 区域。根据请求所针对的域,路由设置为指向正确的区域。现在我想为每个 mvc 区域设置特定的成员资格。我首先尝试了显而易见的方法,并尝试覆盖每个区域的 web.config 部分以更改提供程序的 applicationName 属性。这不起作用,因为该区域没有设置为应用程序根。有没有简单的方法来区分每个区域的用户?

【问题讨论】:

  • 我有点好奇你为什么要利用区域来做这件事。这不是他们真正的正常用例。
  • 您所描述的是一个多租户应用程序。搜索那个词,你会找到几个例子。
  • @Mallioch 我这样做是因为我很便宜而且我喜欢干净的网址。 :) 我有一个托管帐户,但维护自己的个人域以及一个用于我的教堂的域,并且我正在为我妻子的摄影创建一个。这种设置允许我将每个域保持为逻辑上独立的 mvc 区域,为每个域维护干净的 url,同时仍然只使用一个托管帐户和一个 sql 数据库。
  • 正常用例骑彩虹独角兽。

标签: asp.net-mvc asp.net-membership membership membership-provider asp.net-mvc-areas


【解决方案1】:

我想我有一个可行的解决方案,可以让每个区域完全分开。使用默认模板作为起点,我向 MvcApplication1.Models.AccountMembershipService 类添加了另一个构造函数以接受字符串(还修改了现有构造函数以消除歧义)。

    public AccountMembershipService()
    {
        _provider = Membership.Provider;
    }

    public AccountMembershipService(MembershipProvider provider)
    {
        _provider = provider ?? Membership.Provider;
    }

    public AccountMembershipService(string applicationName)
        : this()
    {
        _provider.ApplicationName = applicationName;
    }

然后我将 AccountController 复制到每个区域并修改 Initialize 重载以包含路由数据中的区域名称。

    protected override void Initialize(RequestContext requestContext)
    {
        if (FormsService == null) { FormsService = new FormsAuthenticationService(); }            
        if (MembershipService == null) { MembershipService = new   AccountMembershipService(requestContext.RouteData.DataTokens["area"].ToString()); }

        base.Initialize(requestContext);
    }

现在每个区域都在表单身份验证下注册为一个新应用程序,所有用户和角色都应该分开。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-16
    相关资源
    最近更新 更多