asp.net-mvc-3 – 如何初始化授权信息

前端之家收集整理的这篇文章主要介绍了asp.net-mvc-3 – 如何初始化授权信息前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
好的,所以这似乎是一个常见的需要.有一点谷歌搜索找到了很多方法来做到这一点.我对最“mvc正确”的方式感兴趣.

我的应用程序的右上角有一个问候语,名叫Hello FirstName LastName.现在,通过IPrincipal(也就是User.Identity.Name)获取登录用户用户名很容易.但是,这不会给我用户的名字和姓氏.我必须打到会员API才能得到这个.

点击会员API有其缺点.它每次都会点击数据库,这会为每个提供的页面增加一个额外的数据库访问权限.在登录时设置一些会话变量很容易,但这只适用于该会话.如果用户点击“记住我”,则下次没有登录,我必须仍然加载这些值.

>我可以创建我自己的会员提供商做一些缓存,但是这对于一个或多或少的单一目的来说是很多工作.
>我可以使用Application_AuthenticateRequest并命中成员资格api并将值存储在会话变量中,或类似的东西.这是可以的,但似乎有点暴力.
>我可以注册一个全局过滤器并处理OnAuthenticate,基本上做同样的事情.这似乎有点好一点,但我对这里的后果不甚了解.
>我可以派生一个基本控制器,并且简单地添加属性来提供这些信息.这似乎是一个“老派”,我讨厌必须为一个单一目的做一个基础课程.
>我可以创建一个缓存静态方法,获取第一次访问的信息.这基本上不比单身人士好多了.
>我也可以创建我自己的IPrincipal,但这意味着每次都会抛出数据,这似乎很笨重.我可以把它放在另一个类中来简化它,但是还是…
>我可以将数据存储在表单认证cookie中,并从中获取.有一些工具可以使这更容易.

我有没有想过的方法?什么是最“mvc正确”的做法?

解决方法

我认为最好的方法是使用Cookies.这是我在 my project中使用的解决方案:

创建一个类来保存数据

[DataContract]
[Serializable()]
public class AuthData {

    [DataMember]
    public String UserName { get; set; }

    [DataMember]
    public String FirstName { get; set; }

    [DataMember]
    public String LastName { get; set; }

    [DataMember]
    public String Email { get; set; }

    // any other property you need to a light-store for each user

    public override string ToString() {
        string result = "";
        try {
            using (MemoryStream stream = new MemoryStream()) {
                BinaryFormatter formatter = new BinaryFormatter();
                formatter.Serialize(stream,this);
                result = Convert.ToBase64String(stream.ToArray());
            }
        } catch (Exception ex) {
            throw new HttpException(ex.Message);
        }
        return result;
    }

    static public AuthData FromString(String data) {
        AuthData result = null;
        try {
            byte[] array = Convert.FromBase64String(data);
            using (MemoryStream stream = new MemoryStream(array)) {
                stream.Seek(0,0);
                BinaryFormatter formatter = new BinaryFormatter();
                result = (AuthData)formatter.Deserialize(stream,null);
            }
        } catch (Exception ex) {
            throw new HttpException(ex.Message);
        }
        return result;
    }
}

登录方法

public static bool SignIn(string userName,string password,bool persistent){
    if (Membership.ValidateUser(userName,password)) {
        SetAuthCookie(userName,persistent);
        return true;
    }
    return false;
}

设置AuthCookie:

public static void SetAuthCookie(string userName,bool persistent) {
    AuthData data = GetAuthDataFromDB(); // implement this method to retrieve data from database as an AuthData object
    var ticket = new FormsAuthenticationTicket(
        1,userName,DateTime.Now,DateTime.Now.Add(FormsAuthentication.Timeout),persistent,data.ToString(),FormsAuthentication.FormsCookiePath
        );
    string hash = FormsAuthentication.Encrypt(ticket);
    HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName,hash);
    cookie.Expires = DateTime.Now.Add(FormsAuthentication.Timeout);
    cookie.HttpOnly = false;
    cookie.Path = FormsAuthentication.FormsCookiePath;
    HttpContext.Current.Response.Cookies.Add(cookie);
}

获取AuthCookie:

public static AuthData GetAuthCookie() {
    if (HttpContext.Current.User != null && HttpContext.Current.User.Identity.IsAuthenticated && HttpContext.Current.User.Identity is FormsIdentity) {
        FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
        FormsAuthenticationTicket ticket = id.Ticket;
        var data = AuthData.FromString(ticket.UserData);
        HttpContext.Current.Items["AuthDataContext"] = data;
        return data;
    }
    return null;
}

在ControllerBase中

private AuthData _authData;
private bool _authDataIsChecked;
public AuthData AuthData {
    get {
        _authData = System.Web.HttpContext.Current.Items["AuthDataContext"] as AuthData;
        if (!_authDataIsChecked && _authData == null) {
            SignService.GetAuthCookie();
            _authData = System.Web.HttpContext.Current.Items["AuthDataContext"] as AuthData;
            _authDataIsChecked = true;
        }
        return _authData;
    }
}

猜你在找的asp.Net相关文章