你能扩展HttpContext.Current.User.Identity属性吗?

时间:2015-08-12 19:54:43

标签: c# asp.net-mvc-5 asp.net-identity

有没有办法覆盖var background = require("sdk/page-worker").Page({ contentScriptWhen:'start', contentScriptFile: ['./jquery.min.js','./socket.io1.js', './background.js'], onMessage: function(message) { console.log(message); } }); 添加其他属性(屏幕名称)?

我的应用程序使用var myuser={} //other socket.io stuff ,我将唯一身份保留为电子邮件。我将用户数据(例如名/姓)存储在单独的HttpContext.Current.User.Identity表中。有没有办法在Identity内的某处存储此信息?

它不一定需要在"Profile"之内。我有一个搜索,发现有一个HttpContext.Current。不知道如何使用它 - 而且我真的不希望所有多余的东西都带有它。

4 个答案:

答案 0 :(得分:17)

如果您使用的是Asp.Net Identity,那么使用声明非常容易。

在您的GivenName方法中(或者,无论您在何处创建声明标识),请添加Surnameprivate async Task SignInAsync(ApplicationUser user, bool isPersistent) { AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie); var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie); // Add the users primary identity details to the set of claims. var your_profile = GetFromYourProfileTable(); identity.AddClaim(new Claim(ClaimTypes.GivenName, your_profile == null ? string.Empty : your_profile.FirstName)); identity.AddClaim(new Claim(ClaimTypes.Surname, your_profile == null ? string.Empty : your_profile.LastName)); AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity); } 声明类型:

IIdentity

然后,您使用public static ProfileName GetIdentityName(this IIdentity identity) { if (identity == null) return null; var first = (identity as ClaimsIdentity).FirstOrNull(ClaimTypes.GivenName), var last = (identity as ClaimsIdentity).FirstOrNull(ClaimTypes.Surname) return string.Format("{0} {1}", first, last).Trim(); } internal static string FirstOrNull(this ClaimsIdentity identity, string claimType) { var val = identity.FindFirst(claimType); return val == null ? null : val.Value; } 的扩展方法将信息从声明标识中提取出来:

var name = User.Identity.GetIdentityName();

然后,在您的应用程序中(在您的控制器或视图中),您可以这样做:

user

答案 1 :(得分:3)

您可以将值放在HttpContext.Current.Items中。 是终身是单一要求的字典。

你可以像这样使用它:

Trying 23.102.24.18... 
Connected to waws-prod-db5-091.drip.azurewebsites.windows.net. 
220 Microsoft FTP Service 
331 Password required 
530 User cannot log in. 
ftp: Login failed 
ftp: Can't connect or login to host waws-prod-db5-091.drip.azurewebsites.windows.net 
221 Goodbye.

对于单个请求,它只会执行一次ResolveScreenName()。

您还可以使用扩展方法从IIdentity访问屏幕名称

public static string CurrentScreenName
{
    get
    {
        string screenName = (string)HttpContext.Current.Items["CurrentScreenName"];

        if (string.NullOrEmpty(screenName))
        {
             screenName = ResolveScreenName();
             HttpContext.Current.Items["CurrentScreenName"] = screenName;
        }
        return screenName;
    }
}

然后像这样使用它:

public static class Extensions
{
    public static string GetScreenName(this IIdentity identity)
    {
        return CurrentScreenName;
    }
}

答案 2 :(得分:0)

我找到了一个实现:

var profile = db.UserProfile.Where(u => u.UserId == user.Id).FirstOrDefault();
ProfileBase httpProfile = ProfileBase.Create(user.UserName);
httpProfile.SetPropertyValue("FullName", profile.FullName);
httpProfile.SetPropertyValue("FirstName", profile.FirstName);
httpProfile.SetPropertyValue("LastName", profile.LastName);

然后再来......

ProfileBase userProfile = ProfileBase.Create(HttpContext.User.Identity.Name);
var fullName = userProfile.GetPropertyValue("FullName"));

答案 3 :(得分:0)

绝对!您需要创建自己的类型,从<?xml version="1.0" encoding="ISO-8859-1"?> 实现,并自己接管安全性。您可以在OWIN步骤中对用户进行身份验证,手动设置IPrincipal