2012-04-20 90 views
0

我有一个问题我建立在asp.net MVC3站点,
中,我做了我的几个控制器所有的人都认可
因为我不希望未经授权的用户访问该控制器。
我们假设我有一个控制器和2种方法是如下如何创建自定义授权在asp.net MVC3过滤

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是我向他显示他的详细信息的当前用户标识,但是如果某人登录到我的站点并且他访问此URL并手动在URL中手动添加10或任何其他编号,我该怎么办?我的控制器将显示他关于该用户的所有细节。

注:我可以在一个地方或两个地方做到这一点,但我需要一些解决方案,我在一个地方实施,它影响我的整个应用程序。由于

回答

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(); 
    } 
} 
0

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

+0

但在这种情况下,我不得不在我的应用程序中改变很多东西,有没有针对当前情况的解决方案? – Ahsan 2012-04-20 06:27:52

+0

你必须知道服务器端的认证用户。您可以通过认证用户名从db获取用户信息。 – Yorgo 2012-04-20 06:48:27

1

首先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#编程,你应该尊重它的符号:-) 希望这可以帮助

0

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

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

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