获取asp.NET MVC中的当前用户,以便我可以检查用户控件中的操作

时间:2009-06-11 21:16:16

标签: .net asp.net-mvc authentication

我正在使用ASP.NET MVC进行项目。我使用了很多用户控件,我需要检查当前用户并检查它是否有角色等,现在我在每个UserControl中创建用户,我看到了权限。我想改变它,所以我只创建一次。

问题是什么是最好的aproch? viewData [“User”] =用户和获取用户表单在这里或什么?你有什么建议所以我可以摆脱这一行

 LCP.eTorneos.Dal.EntityFramework.JugadorRepository jugadorRepository =
                   new LCP.eTorneos.Dal.EntityFramework.JugadorRepository();
 var jugador = jugadorRepository.GetJugador(User.Identity.Name)
 <% if (Page.User.Identity.IsAuthenticated && jugador.IsAdmin) { %>
      ...
 <%}%>

3 个答案:

答案 0 :(得分:3)

有两种选择。首先,使用ViewData [“User”] - 最简单但不是最好的(不是强类型)。第二个(如果您使用的是View Models),使用所有View模型的基本视图模型:

public class BaseViewModel {
    public Jugador Jugador;

    // Or simply add flag

    public IsAdmin;
}

public class ConcreteViewModel : BaseViewModel {
    public YourModel Model;
}

在控制器中:

var model = new ConcreteViewModel {
    Model = yourModel,
    IsAdmin = true /* false */
};

return View(model);

在视图中:

<%@ Page MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<ConcreteViewModel>" %>

<!-- Or in SiteMaster: -->

<%@ Master Inherits="System.Web.Mvc.ViewMasterPage<BaseViewModel>" %>

<% if(Model.IsAdmin) { %>

...

<% } %>

<强>更新:

最好避免使用自定义过滤器复制代码并设置ViewModel的基础部分:

public class IsAdminAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // ...

        (filterContext.Controller.ViewData.Model as BaseViewModel).IsAdmin = true; /* flase */
    }
}

答案 1 :(得分:1)

首先谢谢@ eu-ge-ne。

这就是我所做的,我愿意接受新的建议,但这似乎有效: 我像这样创建一个ActionFilterAttribute:

 public class JugadorAttribute : ActionFilterAttribute {
    public override void OnActionExecuted(ActionExecutedContext filterContext) {
        JugadorRepository jugadorRepository = new JugadorRepository();
        Jugador jug = jugadorRepository.GetJugador(filterContext.HttpContext.User.Identity.Name);
        filterContext.Controller.ViewData["JugadorActual"] = jug; 
    }
}

这将ViewData放在页面的当前播放器中。然后在我的控制器中我这样做:

 [JugadorAttribute()]
public class HomeController : Controller {

现在的问题是ViewData不是强类型的,所以我在Html类中创建了这个帮助器:

 public static class JugadorHelper {
    public static Jugador GetJugador(this HtmlHelper html) {
        return ((LCP.eTorneos.Dal.EntityFramework.Jugador)html.ViewData["JugadorActual"]);
    }
}

和Whoala,现在我可以在我的观点中做到这一点:

Html.GetJugador().IsAdmin

答案 2 :(得分:1)

我相信这样的事情:

<%= Utils.GetJugador(ViewData).IsAdmin %>

比这更好:

<%= Html.GetJugador().IsAdmin %>

因为HtmlHelper扩展仅用于生成HTML标记

<强>更新

using System.Web.Mvc;
using LCP.eTorneos.Dal.EntityFramework;

public static class Utils {
    public static Jugador GetJugador(ViewDataDictionary ViewData) {
        return ViewData["JugadorActual"] as Jugador;
        /* OR maybe ?
         * return (Jugador)(ViewData["JugadorActual"] ?? new Jugador());
         */
    }
}

希望这有帮助