如何在asp.met mvc应用程序

时间:2017-08-14 15:45:32

标签: c# asp.net asp.net-mvc razor asp.net-mvc-5

我正处于ASP.Net MVC 5 Web开发的学习阶段,我被困在一个地方。所以,我有一个网站,有三个流程。

  1. 非登录用户
  2. 经过身份验证的用户(租户)
  3. 经过身份验证的用户(所有者)
  4. 现在,在注册过程中,我只是添加了一个复选框来捕获用户是否将成为租户或所有者。 现在,所有三个(非登录,所有者和租户)的视图文件都需要不同。

    截至目前,我知道如何处理two type of user (non-logged in and (tenant)logged in)。在我的_ViewStart.cshtml文件中,我执行了类似下面的操作

    @{   
        if(User.Identity.IsAuthenticated)
        {
            Layout = "~/Views/Shared/_LoggedInLayout.cshtml";
        }
    else
        {
            Layout = "~/Views/Shared/_Layout.cshtml";
        } 
    }
    

    到目前为止一切顺利。但你可以清楚地看到没有“租户和所有者用户”的识别。鉴于我在注册期间将拥有一个属性,对于租户和所有者来说都是真实的。

    我想做类似下面的事情

    @{   
        if(User.Identity.IsAuthenticated)
        {
         if(User.IsTenant)
         {Layout = "~/Views/Shared/_LoggedTenantLayout.cshtml";
         }
         else{Layout = "~/Views/Shared/_LoggedInOwnerlayout.cshtml";
         }      
        }
    else
        {
            Layout = "~/Views/Shared/_Layout.cshtml";
        } 
    }
    

    但我读了一些关于区域,然后路由的内容。所以,我很困惑,如果你们都有三种类型的用户流,你会采用什么方法。我的意思是我需要做一些路线操作或其他什么。有人可以在这里指导我。我知道还有一些叫做角色的东西。但我认为这是通过添加可能是一些编辑按钮或其他内容在页面中添加额外权限。由于我是初学者,有人可以告诉我如何将租户,所有者和未登录的用户流分开。

      

    所有者需要查看完全不同的视图文件和选项   与房客一起去。我知道这个问题有点广泛,但如果有人能给我一个关于如何分离流程的基本小代码片段,我可以从那里开始。

2 个答案:

答案 0 :(得分:2)

您的前进道路取决于此问题的答案:租户和所有者是不同的用户类型还是仅限权限集?人们经常将这两者混为一谈。就目前而言,看起来好像只是想要对待租户"单向和"所有者"另一个,可以通过角色轻松解决。从本质上讲,租户被分配了一个像"租户"并且所有者被分配了像"所有者"这样的角色。然后,您可以通过以下方式保护某个角色或其他角色的某些控制器/操作:

[Authorize(Roles = "Owner")]

然后只允许所有者访问它。对于包括不同布局的东西。您可以分支User.IsInRole

if (User.IsInRole("Tenant"))
{
    Layout = "~/Views/Shared/_LoggedTenantLayout.cshtml";
}
else if (User.IsInRole("Owner"))
{
    Layout = "~/Views/Shared/_LoggedInOwnerlayout.cshtml";
}
else
{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

但是,如果这些是不同的用户类型,您需要收集和保存完全不同类型的信息,那么您应该通过类型继承来处理它。例如,租户可能有MonthlyPayment,而这种类型的信息对于所有者没有意义。在那种情况下,您可以:

public class Tenant : ApplicationUser
{
    // Tenant-specific properties
}

public class Owner : ApplicationUser
{
    // Owner-specific properties
}

public class ApplicationUser: IdentityUser
{
    // Shared properties
}

默认情况下,Entity Framework将通过创建一个包含所有用户类型列的单个数据库表以及Discriminator列来处理此类继承。 Discriminator列将保存已保存的类名,即" Tenant"," Owner"或" ApplicationUser"中的一个,实体框架然后,当您查询用户时,将使用它来实例化正确的类型。

在大多数情况下,这很好用,但是你必须知道你不能在任何派生类型上拥有不可为空的列。这是因为其他派生类型或基本类型无法填充此列,因为它们不具备该属性。但是,您仍然可以通过视图模型强制执行某些特定属性,例如收集用户输入的表单;它不能在数据库级别强制执行。

如果这是一个交易破坏者,或者您只是不喜欢将所有内容放在一个表中,那么您可以选择使用每个类型的表继承策略。有了这个,您就可以为每种类型设置一个表格ApplicationUserTenantOwner。但是,ApplicationUser的表将包含所有基本列以及所有用户类型之间共享的所有内容,而派生类型表将仅包含特定于其唯一属性的列。要使用此类型的继承策略,只需将Table属性添加到派生类型:

[Table("Tenants")]
public class Tenant : ApplicationUser

答案 1 :(得分:1)

这里有两个概念:

  • 身份验证(登录与否)
  • 授权(租户,所有者)

您已经找到了身份验证部分。

对于授权,您可以使用角色。一般的想法是,您将在注册时为用户分配一个角色(基于您的复选框)。从那以后,您可以检查用户所属的角色并进行适当的路由。

您可以通过多种方式处理内容的处理方式。其中一个是Areas。理论上,您可以为租户创建一个区域,为业主创建一个区域,尽管这可能对您的学习目的而言过于苛刻。

查看以下教程了解实施细节: https://code.msdn.microsoft.com/ASPNET-MVC-5-Security-And-44cbdb97