我有一个自定义授权类,它允许我检查用户是否 Admin ,以及他们是否具有访问某些页面的正确用户角色。例如,如果用户是 Admin ,则他们应该能够访问所有客户端页面,但如果用户只有一种类型的客户端访问权限,那么他们将只访问该特定客户端页面。但是,这不起作用。
如果我在新的浏览器窗口中启动我的程序的新版本,IsAuthenicated
将在角色扩展上设置为false。但是,如果我在同一个浏览器实例中再次运行该程序,它将说明用户已经过身份验证,并且会继续正常运行。有没有人知道如何修复用户未在浏览器的第一个实例上设置为经过身份验证的事实?
登录:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model); ;
}
if (returnUrl == null || returnUrl == "/")
{
returnUrl = "/APL/HomePage/Index";
}
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
return RedirectToAction("Index", "Homepage", new { client = User.Role() });
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
case SignInStatus.Failure:
default:
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
}
}
自定义授权类:
public class AuthorizeClient : AuthorizeAttribute {
protected override bool AuthorizeCore(HttpContextBase httpContext) {
bool rt = false;
if (httpContext.User.IsInRole("Admin")) {
string clientName = httpContext.Request.RequestContext.RouteData.Values["client"].ToString();
rt = false;
}
else if (httpContext.Request.RequestContext.RouteData.Values["client"] != null) {
string clientName = httpContext.Request.RequestContext.RouteData.Values["client"].ToString();
rt = httpContext.User.IsInRole(clientName);
}
return rt;
}
角色延伸:
public static string Role(this IPrincipal user) {
if (user.Identity.IsAuthenticated) {
ClaimsIdentity claimsIdentity = user.Identity as ClaimsIdentity;
foreach (var claim in claimsIdentity.Claims) {
if (claim.Type == "Role")
return claim.Value;
}
return "";
}
else
return "";
}
答案 0 :(得分:0)
User.Identity.IsAuthenticated将被设置为true,直到下一个请求。
FormsAuthentication.SetAuthCookie(acct.UserName,true);验证用户并确保在web.config中设置
SetAuthCookie方法将表单身份验证票证添加到Cookie集合,或者如果CookiesSupported为false,则将URL添加到URL。表单身份验证票证将表单身份验证信息提供给浏览器发出的下一个请求。