首页 新闻 会员 周边

HttpContext.User.Identity.IsAuthenticated判断

0
悬赏园豆:20 [已解决问题] 解决于 2019-11-01 13:53

MVC中用户登录后存入到cookie中
要是我管理员登陆后也存入到这里面的话怎么判断谁是管理员谁是用户呢

登录时我有判断,
1代表管理员
db.where.Users(n=>n.status==1)
2代表用户,
db.where.Users(n=>n.status==2)
可一旦登录存储到cookIe中,
两个不同的权限这个岂不是用户可以登录管理员的页面???
这个该怎么去处理呢??
我可能表达的不是很清楚。。。。

小手冰凉tel的主页 小手冰凉tel | 初学一级 | 园豆:73
提问于:2019-05-25 18:40
< >
分享
最佳答案
0

using System.Linq;
using System.Net.Http.Headers;
using System.Security.Claims;
using System.Security.Principal;
using System.Text;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Filters;
using Gms.Models;
using Gms.Models.Bussiness;

namespace Gms.Utils
{

public static class IPrincipalEx
{
    public static Account GetAccount(this IPrincipal principal)
    {
        return (principal as LPrincipal)?.Account;
    }
}
public class LPrincipal : GenericPrincipal
{
    public Account Account { get; }
    public LPrincipal(IIdentity identity, Account account) : base(identity, new[] { account.Role.ToString() })
    {
        Account = account;
    }
}
public class SessionData
{
    const string AccountKey = "account";

    public static Account  Account
    {
        get => HttpContext.Current.Session[AccountKey] as Account;
        set => HttpContext.Current.Session[AccountKey] = value;
    }
}
public class LAuthenticateAttribute : FilterAttribute, IAuthenticationFilter
{
    private const string LoginPage = "~/Account/Index";
    private const string MainPage = "~/Account/Home";
    private bool IsLogin { get; } = false;
    private RoleCatelog Role { get; }
    public LAuthenticateAttribute(RoleCatelog role =RoleCatelog.All, bool isLoginPage = false)
    {
        Role = role;
        IsLogin = isLoginPage;
    }

    public void OnAuthentication(AuthenticationContext filterContext)
    {
                //根据自己逻辑构建Principal ,Account 包含Role
                //filterContext.Principal = new LPrincipal(identity, account);
    }

    public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
    {
        //filterContext.HttpContext.Response.StatusDescription = $"{DateTime.Now:yyyy-MM-dd HH:mm:ss}";
        //throw new NotImplementedException();
    }
}

}

上文在服务器端用session map Account(自己需要什么属性加什么属性);
cookie同理,你需要在服务器端 (内存或者硬盘之类)map,你当然也可以直接写(存)在客户端cookie中,但如果你这么写无疑把权限给了客户端。
如果只是角色不同模板不同,你干了上面后,还可以在razor view前,重载Controller,让这个子类自动去完成指定模板;比如可以以下方式:

public class ControllerRouteBase<T> : EntityControllerBase<T> where T : class
{
    protected override ViewResult View(string viewName, string masterName, object model)
    {
        if (!string.IsNullOrEmpty(viewName)) return base.View(viewName, masterName, model);

        var controllerSpliters = GetType().Name.Replace("Controller", string.Empty).Split('_');
        viewName = $"~/Views/Bussiness/{controllerSpliters.First()}/{controllerSpliters.Last()}.cshtml";
        return base.View(viewName, masterName, model);
    }
}
收获园豆:20
花飘水流兮 | 专家六级 |园豆:13560 | 2019-05-26 14:00

public static int ValidateUser(Users u)
{
BlogsEntities db = new BlogsEntities();
var res = db.Users.Where(ue => ue.UserName == u.UserName && ue.RoleID == u.RoleID).FirstOrDefault();
if (res != null)
{
//if (res.UserPwd == Encrypt.MD5Encrypt(u.UserPwd))
if (res.UserPwd == u.UserPwd)
{
//0:未注册,1:未激活,2:激活,3:密码错误
if (res.Status == 2)
{
return 2;//验证成功
}
else
{
return 1;//未激活
}
}
else
{
return 3;//密码错误
}
}
else
{
return 0;//未注册
}
}

这个是登录时的一个判断,是否激活,其中RoleID为1时代表管理员登陆,2代表用户登录,查询到信息后会返回账号的当前状态->0:未注册,1:未激活,2:激活,3:密码错误,验证成功后会调用下面的方法,将用户存入进去

/// <summary>
/// 存入cookie
/// </summary>
/// <param name="userName"></param>
/// <param name="createPersistentCookie"></param>
/// <param name="roles"></param>
public static void SignIn(string userName, bool createPersistentCookie, IEnumerable<string> roles)
{
var str = string.Join(",", roles);
var authTicket = new FormsAuthenticationTicket(
1,
userName, //user id
DateTime.Now,
DateTime.Now.AddDays(30), // expiry
createPersistentCookie,
str,
"/");
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(authTicket));

        if (authTicket.IsPersistent){
            cookie.Expires = authTicket.Expiration;
        }
        HttpContext.Current.Response.Cookies.Add(cookie);
    }

    /// <summary>
    /// 退出登录
    /// </summary>
    public static void SignOut()
    {
        FormsAuthentication.SignOut();
    }

这个是登录成功后将账号存入到cookie中,然后通过HttpContext.User.Identity.IsAuthenticated判断是否验证成功,问题是管理员和用户的账号都存进去了,该怎么去取值来判断谁是管理员和用户
大佬,您的那个太高深了,我有些看不懂

小手冰凉tel | 园豆:73 (初学一级) | 2019-05-27 10:41

@梦中梦i: Account类 里面属性

花飘水流兮 | 园豆:13560 (专家六级) | 2019-05-27 10:44

@花飘水流兮:
public class SessionData
{
const string AccountKey = "account";

public static Account  Account
{
    get => HttpContext.Current.Session[AccountKey] as Account;
    set => HttpContext.Current.Session[AccountKey] = value;
}

}
是这个嘛?

小手冰凉tel | 园豆:73 (初学一级) | 2019-05-27 10:49

@梦中梦i: 省略没写;
class Account
{
。。。。。。要什么加什么
}

要怎么存也可以自己管(内存或者硬盘之类),自己在实现中自己决定都可以。

花飘水流兮 | 园豆:13560 (专家六级) | 2019-05-27 10:56

@花飘水流兮:
好的,谢谢,我去试试

小手冰凉tel | 园豆:73 (初学一级) | 2019-05-27 11:00
其他回答(1)
0

你cookie里存的是什么?把status存进去就行了 吧

会长 | 园豆:12401 (专家六级) | 2019-05-25 22:00
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册