从使用个人用户帐户的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"/> 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)
开箱即用的方式。
答案 0 :(得分:3)
您可以注册IAuthorizationFilter
或IActionFilter
实施来完成此任务。在这些过滤器中,您可以检查请求是否正在尝试访问特权操作(如果用户已登录或具有足够的权限)。
如果您使用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();
}
这似乎有效,但如果有更好的方法,我会感激任何反馈或建议。