.net MVC控制器动作方法的属性

Kyl*_*yle 8 authentication asp.net-mvc roleprovider membership-provider

基本上我想在某人不属于我的属性中列出的角色时显示友好消息.目前我的应用程序只是将用户吐回到登录屏幕.我已经阅读了几篇关于创建一个仅扩展[AuthorizeAttribute]的自定义属性的帖子,但我认为必须有一些开箱即用的东西才能做到这一点?

有人可以指出我在正确的方向,我需要看到没有它将用户发送到登录表格,而只是拍摄他们"未授权"的消息?

小智 6

我可能在添加$ 0.02时有点晚,但是当您创建CustomAuthorizationAttribue时,可以使用AuthorizationContext.Result属性来指定AuthorizeAttribute.HandleUnauthorizedRequest方法指向用户的位置.

这是一个非常简单的示例,允许您指定在授权失败后应该发送用户的URL:

public class Authorize2Attribute : AuthorizeAttribute
{
    // Properties

    public String RedirectResultUrl { get; set; }

    // Constructors

    public Authorize2Attribute()
        : base()
    {
    }

    // Overrides

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (String.IsNullOrEmpty(RedirectResultUrl))
            base.HandleUnauthorizedRequest(filterContext);

        else
            filterContext.Result = new RedirectResult(RedirectResultUrl);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我想按照上一篇文章的建议将用户重定向到/ Error/Unauthorized:

[Authorize2(Roles = "AuthorizedUsers", RedirectResultUrl = "/Error/Unauthorized")]
public ActionResult RestrictedAction()
{
    // TODO: ...
}
Run Code Online (Sandbox Code Playgroud)


DM.*_*DM. 2

如果您想要简单或完全控制逻辑,您可以在操作方法中调用它:

User.IsInRole("NameOfRole");
Run Code Online (Sandbox Code Playgroud)

它返回一个布尔值,您可以根据该结果执行其余的逻辑。

我在某些情况下使用的另一种是:

System.Web.Security.Roles.GetRolesForUser();
Run Code Online (Sandbox Code Playgroud)

我认为这会返回一个 string[] 但不要引用我的观点。

编辑: 一个例子总是有帮助的......

public ActionResult AddUser()
{
    if(User.IsInRoles("SuperUser")
    {
        return View("AddUser");
    }
    else
    {
        return View("SorryWrongRole");
    }
}
Run Code Online (Sandbox Code Playgroud)

只要您的返回类型是“ActionResult”,您就可以返回任何接受的返回类型(ViewResult、PartialViewResult、RedirectResult、JsonResult...)