Implementing IPrincipal and IIdentity in MVC with use of custom membership and role provider

烂漫一生 提交于 2019-11-30 15:43:28

问题


I'm stuck with the implementation of a custom iprincpal and iidentity object. I spend a day now for searching how to implement these right and extend it with more informations.

I want to extend the Information @Context.User.Identity.Name with custom variables like full name or something else.

EDIT: Now i got the following code but if i try to read @((CustomPrincipal)Context.User.Identity).Nachname I'm getting a error that System.Web.Security.FormsIdentity could not be casted to CustomPrincipal.

Any ideas?

public class CustomPrincipal : GenericPrincipal
{
    public CustomPrincipal(IIdentity identity, String[] roles) : base(identity, roles){ 

    }
    public String Vorname { get; set; }
    public String Nachname { get; set; } 
}

AccountModel:

public class FormsAuthenticationService : IFormsAuthenticationService
{
    public void SignIn(string userName, bool createPersistentCookie)
    {
        if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Der Wert darf nicht NULL oder leer sein.", "userName");
        // Grab user information to insert
        KIMembershipUser membershipUser = (KIMembershipUser)Membership.GetUser(userName);
        var customInfo = String.Format("{0}|{1}", membershipUser.Vorname, membershipUser.Nachname);
        // Create and encrypt the ticket
        var ticket = new FormsAuthenticationTicket(
            2, // Version number
            userName, // Username
            DateTime.Now, // Issue date
            DateTime.Now.AddMinutes(30), // Expiration date
            createPersistentCookie, // Is it persistent?
            customInfo // User data
        );
        var encTicket = FormsAuthentication.Encrypt(ticket);
        // Store the ticket into a cookie
        var cookie = FormsAuthentication.GetAuthCookie(FormsAuthentication.FormsCookieName,createPersistentCookie);
        cookie.Value = encTicket;
        // Append the cookie to the response
        HttpContext.Current.Response.Cookies.Add(cookie); 

        //FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
    }

    public void SignOut()
    {
        FormsAuthentication.SignOut();
    }
}

global.asax:

    protected void Application_PostAuthenticateRequest(){
        // Collect current security information
        var principal = HttpContext.Current.User as RolePrincipal;
        if (principal == null)
            return;
        var identity = principal.Identity as FormsIdentity;
        if (identity == null)
            return;
        var roles = principal.GetRoles();
        // Extract user data in the authentication ticket
        var customInfo = identity.Ticket.UserData;
        var tokens = customInfo.Split('|');
        // Build a richer principal object
        var CustomPrincipal = new CustomPrincipal(identity, roles){
            Vorname = tokens[0],
            Nachname = tokens[1]
        };
        // Store the new principal in the HttpContext
        HttpContext.Current.User = CustomPrincipal;
    }

回答1:


Use (CustomPrincipal)Context.User).Nachname instead of (CustomPrincipal)Context.User.Identity).Nachname



来源:https://stackoverflow.com/questions/6597243/implementing-iprincipal-and-iidentity-in-mvc-with-use-of-custom-membership-and-r

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!