使用相同的路由,但为经过身份验证/未经身份验证的用户显示不同的内容

时间:2016-07-16 18:21:14

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

我在.NET 4.6,MVC 5上构建一个新站点。我想为用户使用相同的路由,无论他们是否已登录,但我希望他们能够看到主页登录时登录并查看个人内容.Facebook就是一个例子 - 无论您是否登录,Facebook的URL都是facebook.com

我很乐意使用任何必要的方法,但我不确定如何最好地完成这项工作。

2 个答案:

答案 0 :(得分:2)

根据用户是否经过身份验证来提供模型数据。你可以轻松检查这个

this.User.Identity.IsAuthenticated

根据这一点,您可以有条件地构建视图内容,甚至可以渲染一些部分视图,例如

// controller
model.ShowSomething = this.User.Identity.IsAuthenticated;

然后

@* view *@

@if ( Model.ShowSometing ) {
   Html.Partial( something that only authenticated users will see )
}

请记住,匿名用户可以访问您的操作(无Authorize属性)。

答案 1 :(得分:2)

对于您希望在每个页面上显示的内容,例如仅显示指向登录的某些导航栏链接,您可以直接在布局视图中进行身份验证检查,如下所示:

@if (Request.IsAuthenticated)
{
    //only logged in users see this -- perhaps nav bar links or other site-wide content
}

您还可以创建一个角色或权限提供者,这样您就可以根据角色等更精细地控制页面上显示的部分。然后执行与上面相同的操作,并根据他们的角色检查用户是否被允许这对于仅根据他们所处的角色显示添加或编辑按钮非常有用。例如:

@if (Request.IsAuthenticated && User.IsInRole("Admin"))
{
    //only logged in users see this who are in the admin role
}

如果你在视图中做了太多这样的话,这当然会变得混乱,所以正如Wiktor Zychla在上面解释的那样,你也可以在模型中添加这些属性,然后只在视图中引用模型。

但是对于将在整个网站范围内的内容(例如在布局文件中有条件地显示导航栏链接),在视图中引用请求或用户就可以了。