0

我有一个问题,我正在 asp.net mvc3 中构建一个站点,
在该站点中,我使我的几个控制器都获得了授权
,因为我不希望未经授权的用户访问该控制器。
假设我有一个控制器和 2 个方法,如下所示

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Com.health.Controllers
{
    [Authorize]
    public class MyfirstController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }        
        public ActionResult seeyourDetails(int id)
        {
            return View();
        } 
    }
}

现在假设我们的方法seeyourDetails告诉任何用户他的帐户信息,但问题是当用户访问此方法时,URL 是 http://www.exampple.com/Myfirst/seeyourDetails/1010当前用户 ID 在哪里,我通过它向他显示他的详细信息,但是我应该怎么做,如果一个人登录到我的网站,他访问此 URL 并手动添加10或 URL 中的任何其他数字,我的控制器将向他显示有关该用户的所有详细信息。

注意:我可以在一个或两个地方执行此操作,但我需要在一个地方实施一些解决方案,它会影响我的整个应用程序。谢谢

4

4 回答 4

2

我看到的唯一方法是检查查询字符串中的用户 id 是否与登录的用户 id 相同。这更像是一种修补解决方案,正确的方法是更改​​应用程序的工作方式。像这样的东西,您仍然需要对其进行一些修改。

[AttributeUsage(AttributeTargets.Method|AttributeTargets.Class, AllowMultiple = false)]
public class  MyAuthorizeAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
        var ctx = filterContext.HttpContext;
        var name = ctx.User.Identity.Name;

        //get user id from db where username= name   

        var urlId = Int32.Parse(ctx.Request.Params["id"]);
        if (userId!=urlId)
            filterContext.Result = new HttpUnauthorizedResult();
    }
}
于 2012-04-20T08:04:37.777 回答
2

首先Authorize是非常强大和细化。您可以在类级别和方法级别使用它。您还可以设置哪些角色可以访问它。

[Authorize]
public class MyFirstController : Controller

你基本上是说任何已经过身份验证的用户,你也可以使用

[Authorize(Roles="Administrator")]
public class MyFirstController : Controller

给你更精细的控制。在这里,您说只有管理员角色的用户才能访问这些内容。现在对于SeeYourDetailsAction,您实际上不应该发送用户 ID。如果用户当前已登录,您可以访问他/她的详细信息,如下所示:

var current = Membership.GetUser();

所以你所有的代码看起来像这样:

using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using System.Collections.Generic;


namespace TestArea.Controllers
{
    [Authorize]
    public class MyFirstController : Controller
    {

        public ActionResult Index()
        {
            return View();
        }

        public ActionResult SeeYourDetails() 
        {
            //get the currently logged in user
            var current = Membership.GetUser();
            //you can always do something else here
            return View(current);
        }


    }

更多关于授权属性的信息http://msdn.microsoft.com/en-us/library/system.web.mvc.authorizeattribute.aspx

最后但并非最不重要的。如果你要用 C# 编程,你应该尊重它的符号:-) 希望这会有所帮助

于 2012-04-20T09:17:41.023 回答
0

您不必从查询字符串参数中获取用户 ID。您必须设置为经过身份验证的用户信息的会话。当您需要知道经过身份验证的用户时,从会话中获取它

于 2012-04-20T06:15:30.770 回答
0

您要说的是数据授权,用户登录网站后只能看到他的详细信息。

您可以按照@MikeSW 在授权过滤器中所说的创建自定义授权过滤器,检查登录用户的 id 是否与查询字符串中传递的 id 相同,并且您必须将用户 id 存储在会话中。

由于它是一个过滤器,您也可以在操作级别或控制器级别或全局级别应用。

于 2012-04-20T09:41:46.553 回答