如何创建自定义授权在asp.net MVC3过滤器(how to create custom aut

2019-09-16 15:13发布

我有一个问题我建立在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/10 ,其中10是当前用户ID由我告诉他他的细节,但我应该做的,如果一个人登录到我的网站,他访问这个URL和手动添加什么10或URL任何其他数目我的控制器将告诉他关于该用户的所有细节。

注:我可以这样做在一个地方或两个地方,但我需要一些解决方案,我在一个地方实现,它在我的整个应用效果。 谢谢

Answer 1:

我看到的唯一方法是检查是否从查询字符串中的用户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();
    }
}


Answer 2:

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

[Authorize]
public class MyFirstController : Controller

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

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

给你一个更好的控制。 在这里,你是说只有在管理员角色的用户被允许访问这些内容。 现在的SeeYourDetails行动,你真不该被发送用户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#程序要去你应该尊重它的符号:-)希望这有助于



Answer 3:

你不必从查询字符串参数获得用户ID。 你必须设置为会话认证用户的相关信息。 而从会议上得到它时,你需要知道认证的用户



Answer 4:

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

您可以创建在授权过滤器检查说通过@MikeSW如果作为id在查询字符串中传递的登录用户的ID是相同的自定义过滤器授权以及您必须存储在会话中的用户ID。

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



文章来源: how to create custom authorize filter in asp.net mvc3