【问题标题】:Passing current user as parameter to external url using GET使用 GET 将当前用户作为参数传递给外部 url
【发布时间】:2016-01-11 09:33:44
【问题描述】:

我正在使用 ASP.NET、MVC 5 和 Identity 2.0 构建一个应用程序。

当用户单击导航栏中的某个按钮时,我会捕获当前用户及其安全标记,并将它们作为参数传递给使用 GET 的外部 url。就像这样:

<ul class="nav navbar-nav">
   @if (Request.IsAuthenticated && User != null)
   {
      <li class="menu-item">@Html.ActionLink("External URL", "ExternalUrl", "Home")</li>
   }
...

public ActionResult ExternalUrl()
{
    var user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(User.Identity.GetUserId());
    var userName = user.UserName;
    var par1 = user.SecurityStamp;

    return Redirect("http://externalurl/access.asp?" + "userName=" + userName + "&par1=" + par1);
}

这确实有效,它解决了我的问题,但看起来很难看。我是网络编程的新手,我认为必须有更好/更漂亮的方式来做到这一点。怎么样?

【问题讨论】:

  • 好吧,您可以将 UserName 和 SecurityStamp 保存在声明身份中,这样您就不必一直访问数据库……但这似乎是一个基于意见的问题。我不认为它丑得要命

标签: c# html asp.net-mvc get asp.net-mvc-5


【解决方案1】:

您可以实现自己的 ActionFilterAttribute 来“注入”一个包含您需要的所有用户属性的对象。

您的 UserViewModel 将是:

public class UserViewModel
{
    public string UserName {get; set;}
    public string SecurityStamp {get; set;}
}

过滤器实现:

public class LoggedUserParameterAttribute : ActionFilterAttribute
{
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);

            // Get the User (you have to adjust your code here)                
            var user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(User.Identity.GetUserId());

            // 'Assemble' your logged user with all the needed information
            var userViewModel = UserViewModel {
                UserName = user.UserName,
                SecurityStamp = user.SecurityStamp
            }

            // Create an optional action parameter 'loggedUser'
            filterContext.ActionParameters["loggedUser"] = userViewModel;
        }
}

最后,您可以像这样在任何操作方法中“注入”loggedUser 参数:

[LoggedUserParameter]
public ActionResult ExternalUrl(UserViewModel loggedUser)
{
        return Redirect("http://externalurl/access.asp?" + "userName=" + loggedUser.UserName + "&par1=" + loggedUser.SecurityStamp);
}

【讨论】:

    猜你喜欢
    • 2020-06-05
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    相关资源
    最近更新 更多