C# 使用GET将当前用户作为参数传递给外部url
我正在使用ASP.NET、MVC 5和Identity 2.0构建一个应用程序 当用户单击导航栏中的一个按钮时,我捕获当前用户及其安全戳,并使用GET将其作为参数传递给外部url。就这样,C# 使用GET将当前用户作为参数传递给外部url,c#,html,asp.net-mvc,get,asp.net-mvc-5,C#,Html,Asp.net Mvc,Get,Asp.net Mvc 5,我正在使用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("Externa
<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);
}
@if(Request.IsAuthenticated&&User!=null)
{
}
...
公共操作结果外部URL()
{
var user=System.Web.HttpContext.Current.GetOwinContext().GetUserManager().FindById(user.Identity.GetUserId());
var userName=user.userName;
var par1=user.SecurityStamp;
返回重定向(“http://externalurl/access.asp?“+”用户名=“+userName+”&par1=“+par1”);
}
这确实有效,解决了我的问题,但看起来很难看。我是网络编程新手,我想一定有更好/更漂亮的方法。如何实现?您可以实现自己的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;
}
}
好吧,你可以在声明标识中保留用户名和SecurityStamp,这样你就不必一直访问数据库。。。但这似乎是一个基于观点的问题。我不认为这是丑陋的地狱
[LoggedUserParameter]
public ActionResult ExternalUrl(UserViewModel loggedUser)
{
return Redirect("http://externalurl/access.asp?" + "userName=" + loggedUser.UserName + "&par1=" + loggedUser.SecurityStamp);
}