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;
        }
    }
});