我正在构建一个应用程序并将其与活动目录集成。
所以我将我的app用户验证为活动目录用户,然后我将一些用户的数据存储到Generic主体,将用户身份存储到Generic identity中。user group and user profile
。
我的问题是,当我想使用它时,我无法从通用主体获取用户配置文件数据。
有人可以告诉我该怎么做吗?
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = Context.Request.Cookies[cookieName];
if (authCookie == null)
{
//There is no authentication cookie.
return;
}
FormsAuthenticationTicket authTicket = null;
try
{
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
}
catch (Exception ex)
{
//Write the exception to the Event Log.
return;
}
if (authTicket == null)
{
//Cookie failed to decrypt.
return;
}
String data = authTicket.UserData.Substring(0, authTicket.UserData.Length -1);
string[] userProfileData = data.Split(new char[] { '|' });
//Create an Identity.
GenericIdentity id =
new GenericIdentity(authTicket.Name, "LdapAuthentication");
//This principal flows throughout the request.
GenericPrincipal principal = new GenericPrincipal(id, userProfileData);
Context.User = principal;
注意:上面的代码在全局asax文件中,我想在另一个名为default.aspx
的文件中使用存储在通用主体中的用户配置文件数据。
答案 0 :(得分:8)
首先,你不应该这样做:
GenericPrincipal principal = new GenericPrincipal(id, userProfileData);
//^^ this is wrong!!
构造函数的第二个参数是角色。请参阅docs。
如果您想将数据存储到通用主体中,那么您应该做的是
从GenericIdentity
创建一个类:
class MyCustomIdentity : GenericIdentity
{
public string[] UserData { get; set;}
public MyCustomIdentity(string a, string b) : base(a,b)
{
}
}
像这样创建:
MyCustomIdentity =
new MyCustomIdentity(authTicket.Name,"LdapAuthentication");
//fill the roles correctly.
GenericPrincipal principal = new GenericPrincipal(id, new string[] {});
在这样的页面中获取它:
例如,在Page load中你可以这样做:
protected void Page_Load(object sender, EventArgs e) {
MyCustomIdentity id = (MyCustomIdentity)this.User.Identity
var iWantUserData = id.UserData;
}
答案 1 :(得分:2)
您还可以使用以下代码:
FormsIdentity id = (FormsIdentity)HttpContext.Current.User.Identity;
string userData = id.Ticket.UserData