重定向登录到控制器操作

时间:2016-01-23 21:35:50

标签: asp.net-core asp.net-core-mvc entity-framework-core asp.net-identity-3

从使用个人用户帐户的ASP.NET 5 Web App模板开始我已经设法使用Microsoft帐户进行外部身份验证。当用户点击“登录”时,他们会被重定向到<head> <script> function Car(Make, Miles){ this.make = Make; this.odometerReading = Miles; this.showInfo = function() { alert(this.make + " " + this.odometerReading); } this.setOdometer = function(newMiles) { this.odometerReading = newMiles; } } var car1 = new Car("X", 50); var car2 = new Car("Y", 75); car1.setOdometer(1000); //now it has the right function name and actually uses the parameter. </script> </head> <body> <input type="button" value="Car1" onclick="car1.showInfo()"> <input type="button" value="Car2" onclick="car2.showInfo()"> <input type="button" value="Change Car1" onclick="car1.setOdometer('something Else')"> </body> 中的ExternalLogin,如此

AccountController

这使他们使用他们的Microsoft帐户登录,所有似乎都运行良好。但是,如何拦截直接尝试访问特权操作<form asp-controller="Account" asp-action="ExternalLogin" method="post" asp-route-returnurl="@ViewData["ReturnUrl"]" class="nav navbar-right"> <button type="submit" class="btn btn-null nav navbar-nav navbar-right" name="provider" value="Microsoft" title="Log in"><span class="fa fa-sign-in"/>&nbsp; Log In</button> </form> ,以便将用户重定向到[Authorize] ?可以在ExternalLogin中设置默认操作吗?

编辑1 尝试遵循@Yves的建议我在Filters文件夹中创建了Startup.cs。它没有检查任何条件

CustomAutorizationFilter

已编辑public class CustomAutorizationFilter : IAuthorizationFilter { public void OnAuthorization(Microsoft.AspNet.Mvc.Filters.AuthorizationContext context) { //if (...) // Check you conditions here //{ context.Result = new RedirectToActionResult("ExternalLogin", "Account", null); //} } } ,如下所示

ConfigureServices

当我在本地运行应用程序时,它不再进入主页。它返回一个空白 services.AddMvc(config => { config.Filters.Add(typeof(Filters.CustomAutorizationFilter)); });

显然我有很多不明白的地方。

编辑2:以下是http://localhost:52711/Account/ExternalLogin

的签名
ExternalLogin

这就是ASP.Net 5 Web App Template中 // POST: /Account/ExternalLogin [HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public IActionResult ExternalLogin(string provider, string returnUrl = null) 开箱即用的方式。

2 个答案:

答案 0 :(得分:3)

您可以注册IAuthorizationFilterIActionFilter实施来完成此任务。在这些过滤器中,您可以检查请求是否正在尝试访问特权操作(如果用户已登录或具有足够的权限)。

如果您使用AutorizeAttribute,建议您使用AutorizationFilter。 如果您使用自己的自定义属性,请使用ActionFilter

以下是一个例子:

MVC在每次操作执行之前调用IAuthorizationFilter.OnAuthorization方法。

public class CustomAuthorizationFilter : IAuthorizationFilter
{
    public void OnAuthorization(Microsoft.AspNet.Mvc.Filters.AuthorizationContext context)
    {
        if (...) // Check you conditions here
        {
            context.Result = new RedirectToActionResult("ExternalLogin", "Account", null);
        }
    }
}

要注册此过滤器,请在Startup.cs中编辑ConfigureServices方法:

services.AddMvc(config =>
{
    config.Filters.Add(typeof(CustomAuthorizationFilter ));
});

或者如果您想使用自己的属性,可以使用ActionFilter的{​​{1}}方法检查是否一切都按照您的意愿发生......

答案 1 :(得分:3)

由于我无法按照@Yves的建议CustomAuthorizationFilter工作,所以我采取了令人讨厌的黑客行为。我修改了AccountController Login,如下所示

     // GET: /Account/Login
    [HttpGet]
    [AllowAnonymous]
    public IActionResult Login(string returnUrl = null)
    {
        ViewData["ReturnUrl"] = returnUrl;
        return RedirectToAction(nameof(ExternalLogin), new { provider = "Microsoft", returnUrl = returnUrl });
        //return View();
    }

这似乎有效,但如果有更好的方法,我会感激任何反馈或建议。