C# 使用自定义成员资格和角色提供程序在MVC中实现IPrincipal和IIdentity
我被一个自定义iprincpal和iidentity对象的实现所困扰。我现在花了一天的时间来寻找如何实现这些权利,并用更多的信息来扩展它 我想用诸如全名或其他自定义变量扩展信息C# 使用自定义成员资格和角色提供程序在MVC中实现IPrincipal和IIdentity,c#,model-view-controller,iprincipal,iidentity,C#,Model View Controller,Iprincipal,Iidentity,我被一个自定义iprincpal和iidentity对象的实现所困扰。我现在花了一天的时间来寻找如何实现这些权利,并用更多的信息来扩展它 我想用诸如全名或其他自定义变量扩展信息@Context.User.Identity.Name 编辑:现在我得到了以下代码,但是如果我尝试读取@((CustomPrincipal)Context.User.Identity).Nachname我得到了一个错误,System.Web.Security.formSidenty无法转换到CustomPrincipal
@Context.User.Identity.Name
编辑:现在我得到了以下代码,但是如果我尝试读取@((CustomPrincipal)Context.User.Identity).Nachname
我得到了一个错误,System.Web.Security.formSidenty
无法转换到CustomPrincipal
有什么想法吗
public class CustomPrincipal : GenericPrincipal
{
public CustomPrincipal(IIdentity identity, String[] roles) : base(identity, roles){
}
public String Vorname { get; set; }
public String Nachname { get; set; }
}
会计模型:
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;
}
使用
(CustomPrincipal)Context.User).Nachname
而不是(CustomPrincipal)Context.User.Identity).Nachname
扩展GenericPrincipal和GenericEntity类有什么问题?我不知道有这些对象。如何扩展它们?您可能不需要扩展(继承)它们,最简单的方法是为它们中的每一个构建一个新实例:@Islam Ibrahim我用昨天所做的编辑了我的第一篇文章。也许你有个主意?Do(CustomPrincipal)Context.User).Nachname而不是(CustomPrincipal)Context.User.Identity.Nachname。