ASP MVC 5 部分视图身份验证重定向
ASP MVC5 Partial view authentification redirection
我对 ASP 很陌生,所以请多多包涵 :)
我有一个包含搜索表单的视图。
查看
<div id="search-form" class="row search-form">
@using(Ajax.BeginForm("Search",
"Home",
new AjaxOptions
{
UpdateTargetId = "result",
InsertionMode = InsertionMode.Replace,
LoadingElementId = "ajax_loader"
},
new { @class = "form-horizontal col-sm-offset-3 col-sm-6" }
))
{
<div class="form-group">
<div class="col-sm-10">
@{string query = string.Empty;}
@Html.EditorFor(x => query, new { htmlAttributes = new { @class = "form-control" } })
</div>
<input id="submitbtn" type="submit" value="Search" class="btn btn-primary col-sm-2" />
</div>
}
</div>
<div id="ajax_loader" style="display:none">
<img src="~/Content/Images/ajax_loader.gif" alt="Ajax Loader" />
</div>
<div id="result"></div>
控制器
[AllowAnonymous]
public ActionResult Index()
{
ViewBag.Title = "serach form";
return View();
}
public async Task<ActionResult> Search(string query)
{
WinesApiController winesCtrl = new WinesApiController();
var listOfWines = await winesCtrl.Get(query);
return PartialView("_WineResult", listOfWines);
}
我的控制器中的 Search
方法 returns 一个 PartialView。当我用 [AllowAnonymous]
属性装饰控制器中的所有方法时,一切都运行良好。但是我希望它为任何人显示表单,但只要您单击搜索按钮,就需要登录。所以我删除了所有 AllowAnonymous 属性,但删除了 Index 方法(呈现我的视图的方法) ).现在,我的调用结果不再显示(这很好),但我没有被重定向到登录视图。
那么我的问题是,为什么对局部视图的调用没有将我重定向到登录视图?我猜是因为我看不到提交操作的结果而执行了身份验证,但是为什么我没有重定向?
如果在操作上添加授权属性会怎样?
[Authorize()]
public async Task<ActionResult> Search(string query)
{
WinesApiController winesCtrl = new WinesApiController();
var listOfWines = await winesCtrl.Get(query);
return PartialView("_WineResult", listOfWines);
}
您正在 ajax 调用搜索操作吗?当 ajax 调用授权失败时,默认 asp.net mvc AuthorizeAttribute 不会 return 适当的响应。
您可以编写自己的授权过滤器,return 是更好的响应,如下所示:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public sealed class YourAuthorizeAttribute : AuthorizeAttribute {
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
var httpContext = filterContext.HttpContext;
var request = httpContext.Request;
var response = httpContext.Response;
if (request.IsAjaxRequest()) {
response.SuppressFormsAuthenticationRedirect = true;
response.StatusCode = (int)HttpStatusCode.Unauthorized;
response.End();
}
base.HandleUnauthorizedRequest(filterContext);
}
}
使用此过滤器,您可以使用默认 javascript 代码来处理所有未经授权的情况:
$.ajaxSetup({
statusCode: {
401: function (response) {
var returnUrl = encodeURI(window.location.pathname + window.location.search);
var loginUrl = '/custumer/login?ReturnUrl=' + returnUrl;
window.location.href = loginUrl;
}
}
});
我对 ASP 很陌生,所以请多多包涵 :)
我有一个包含搜索表单的视图。
查看
<div id="search-form" class="row search-form">
@using(Ajax.BeginForm("Search",
"Home",
new AjaxOptions
{
UpdateTargetId = "result",
InsertionMode = InsertionMode.Replace,
LoadingElementId = "ajax_loader"
},
new { @class = "form-horizontal col-sm-offset-3 col-sm-6" }
))
{
<div class="form-group">
<div class="col-sm-10">
@{string query = string.Empty;}
@Html.EditorFor(x => query, new { htmlAttributes = new { @class = "form-control" } })
</div>
<input id="submitbtn" type="submit" value="Search" class="btn btn-primary col-sm-2" />
</div>
}
</div>
<div id="ajax_loader" style="display:none">
<img src="~/Content/Images/ajax_loader.gif" alt="Ajax Loader" />
</div>
<div id="result"></div>
控制器
[AllowAnonymous]
public ActionResult Index()
{
ViewBag.Title = "serach form";
return View();
}
public async Task<ActionResult> Search(string query)
{
WinesApiController winesCtrl = new WinesApiController();
var listOfWines = await winesCtrl.Get(query);
return PartialView("_WineResult", listOfWines);
}
我的控制器中的 Search
方法 returns 一个 PartialView。当我用 [AllowAnonymous]
属性装饰控制器中的所有方法时,一切都运行良好。但是我希望它为任何人显示表单,但只要您单击搜索按钮,就需要登录。所以我删除了所有 AllowAnonymous 属性,但删除了 Index 方法(呈现我的视图的方法) ).现在,我的调用结果不再显示(这很好),但我没有被重定向到登录视图。
那么我的问题是,为什么对局部视图的调用没有将我重定向到登录视图?我猜是因为我看不到提交操作的结果而执行了身份验证,但是为什么我没有重定向?
如果在操作上添加授权属性会怎样?
[Authorize()]
public async Task<ActionResult> Search(string query)
{
WinesApiController winesCtrl = new WinesApiController();
var listOfWines = await winesCtrl.Get(query);
return PartialView("_WineResult", listOfWines);
}
您正在 ajax 调用搜索操作吗?当 ajax 调用授权失败时,默认 asp.net mvc AuthorizeAttribute 不会 return 适当的响应。 您可以编写自己的授权过滤器,return 是更好的响应,如下所示:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public sealed class YourAuthorizeAttribute : AuthorizeAttribute {
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
var httpContext = filterContext.HttpContext;
var request = httpContext.Request;
var response = httpContext.Response;
if (request.IsAjaxRequest()) {
response.SuppressFormsAuthenticationRedirect = true;
response.StatusCode = (int)HttpStatusCode.Unauthorized;
response.End();
}
base.HandleUnauthorizedRequest(filterContext);
}
}
使用此过滤器,您可以使用默认 javascript 代码来处理所有未经授权的情况:
$.ajaxSetup({
statusCode: {
401: function (response) {
var returnUrl = encodeURI(window.location.pathname + window.location.search);
var loginUrl = '/custumer/login?ReturnUrl=' + returnUrl;
window.location.href = loginUrl;
}
}
});