在我的asp.core应用程序上,我有用户身份身份验证。
我想做下一步:如果用户未在网站上授权访问网站时 - 向他展示主页,但是如果他已获得授权 - 向他展示另一个页面(我的示例中的加密控制器页面)。但如果他从主页导航到/加密,则程序应将其重定向到登录页面(现在如何工作)。
在配置中的启动时,我尝试将用户授权时访问站点时访问网站时尝试将其重定向到另一页/加密(默认) - 所有作品(他都将重定向到/加密页面),但是如果他在以前被授权,程序将将他重定向到帐户控制器上登录页面。这就是问题。
我已经注意到,如果用户之前已授权(仅在没有授权的情况下(没有auth cookies)),则帐户控制器不会启动,因此我不能使用帐户Contoller重定向。那么,截取请求(或阅读)或在哪里执行cookie供授权进行检查的地方?还是该怎么办?
我的启动设置:
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentity<User, IdentityRole>()
.AddEntityFrameworkStores<ApplicationContext>();
...
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
app.UseAuthentication();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Encrypt}/{action=Index}");
});
}
我的帐户控制器看起来像:
public class AccountController : Controller
{
private readonly UserManager<User> _userManager;
private readonly SignInManager<User> _signInManager;
public AccountController(UserManager<User> userManager, SignInManager<User> signInManager)
{
_userManager = userManager;
_signInManager = signInManager;
}
[HttpGet]
public IActionResult Login(string returnUrl = null)
{
ViewData["UserName"] = this.GetUserName();
return View(new LoginViewModel { ReturnUrl = returnUrl });
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model)
{
if (ModelState.IsValid)
{
var result =
await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, false);
if (result.Succeeded)
{
if (!string.IsNullOrEmpty(model.ReturnUrl) && Url.IsLocalUrl(model.ReturnUrl))
{
return Redirect(model.ReturnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
return View(model);
}
我的加密控制器看起来像:
[Authorize]
public class EncryptController : Controller
{ ... }
将此代码添加到您的启动中以处理访问请求:
services.ConfigureApplicationCookie(options =>
{
options.AccessDeniedPath = "/Account/Access-Denied";
options.LoginPath = "/Account/Login";
options.LogoutPath = "/Account/Signout";
options.SlidingExpiration = true;
});
在特定的.AccessDeniedPath
中,应通过将其附加到加密视图来减轻您的问题...
我找到了部分解决方案。
这样的配置:
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
...
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}");
});
}
和这样的家庭控制器:
public IActionResult Index()
{
if (User.Identity.IsAuthenticated & !HttpContext.Session.Keys.Contains("Key"))
{
HttpContext.Session.SetInt32("Key", 1);
return RedirectToAction("Index", "Encrypt");
}
else
return View();
}
但是它在会话期间只有1次起作用,因此要通过关闭浏览器再次需要开始会话。
所以仍然不好。
如果我始终会从主页重定向,如果授权 - 他将永远不会看到主页。太好了。