我有一个问题我建立在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任何其他数目我的控制器将告诉他关于该用户的所有细节。
注:我可以这样做在一个地方或两个地方,但我需要一些解决方案,我在一个地方实现,它在我的整个应用效果。 谢谢
我看到的唯一方法是检查是否从查询字符串中的用户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();
}
}
首先, 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#程序要去你应该尊重它的符号:-)希望这有助于
你不必从查询字符串参数获得用户ID。 你必须设置为会话认证用户的相关信息。 而从会议上得到它时,你需要知道认证的用户
你所想说的是数据的授权,用户只能看到他的详细信息登录到网站之后。
您可以创建在授权过滤器检查说通过@MikeSW如果作为id在查询字符串中传递的登录用户的ID是相同的自定义过滤器授权以及您必须存储在会话中的用户ID。
由于它是一个过滤器,你可以在操作级别或控制器级别或全局级别也适用。