ASP.Net MVC:如何读取我的自定义声明值
ASP.Net MVC: How to read my custom claims value
参见下面的代码。我知道通过这种方式我们可以将自定义数据添加到声明中,但现在的问题是如何读回这些值。假设我想读回声明 Email 和 Email2 的值,请告诉我我需要写什么代码来读回声明 Email 和 Email2 的值.
UserManager<applicationuser> userManager = new UserManager<applicationuser>(new UserStore<applicationuser>(new SecurityContext()));
ClaimsIdentity identity = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie
var user = userManager.Find(userName, password);
identity.AddClaim(new Claim("Email", user.Email));
identity.AddClaim(new Claim("Email2", user.Email));
您可以在 ClaimsIdentity
上使用 FindFirst(string type)
方法根据声明类型检索声明。在这种情况下 Email
或 Email2
var claimType = "Email";
var claim = identity.FindFirst(claimType);
var email = claim == null ? string.Empty : claim.Value;
我通常会将声明类型存储在常量中
public static partial class Constants {
public class Security {
public static class ClaimTypes {
public const string Email = "http://schemas.mycompany.com/identity/claims/email";
public const string Email2 = "http://schemas.mycompany.com/identity/claims/email2";
}
}
}
然后创建扩展方法以从 IIdentity
实现中提取它们,前提是它是从 ClaimsIdentity
.
派生的
public static class GenericIdentityExtensions {
/// <summary>
/// Return the Email claim
/// </summary>
public static string GetEmail(this IIdentity identity) {
if (identity != null && identity.IsAuthenticated) {
ClaimsIdentity claimsIdentity = identity as ClaimsIdentity;
if (claimsIdentity != null)
return claimsIdentity.FindFirstOrEmpty(Constants.Security.ClaimTypes.Email);
}
return string.Empty;
}
/// <summary>
/// Return the Email2 claim
/// </summary>
public static string GetEmail2(this IIdentity identity) {
if (identity != null && identity.IsAuthenticated) {
ClaimsIdentity claimsIdentity = identity as ClaimsIdentity;
if (claimsIdentity != null)
return claimsIdentity.FindFirstOrEmpty(Constants.Security.ClaimTypes.Email2);
}
return string.Empty;
}
/// <summary>
/// Retrieves the first claim that is matched by the specified type if it exists, String.Empty otherwise.
/// </summary>
internal static string FindFirstOrEmpty(this ClaimsIdentity identity, string claimType) {
var claim = identity.FindFirst(claimType);
return claim == null ? string.Empty : claim.Value;
}
}
参见下面的代码。我知道通过这种方式我们可以将自定义数据添加到声明中,但现在的问题是如何读回这些值。假设我想读回声明 Email 和 Email2 的值,请告诉我我需要写什么代码来读回声明 Email 和 Email2 的值.
UserManager<applicationuser> userManager = new UserManager<applicationuser>(new UserStore<applicationuser>(new SecurityContext()));
ClaimsIdentity identity = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie
var user = userManager.Find(userName, password);
identity.AddClaim(new Claim("Email", user.Email));
identity.AddClaim(new Claim("Email2", user.Email));
您可以在 ClaimsIdentity
上使用 FindFirst(string type)
方法根据声明类型检索声明。在这种情况下 Email
或 Email2
var claimType = "Email";
var claim = identity.FindFirst(claimType);
var email = claim == null ? string.Empty : claim.Value;
我通常会将声明类型存储在常量中
public static partial class Constants {
public class Security {
public static class ClaimTypes {
public const string Email = "http://schemas.mycompany.com/identity/claims/email";
public const string Email2 = "http://schemas.mycompany.com/identity/claims/email2";
}
}
}
然后创建扩展方法以从 IIdentity
实现中提取它们,前提是它是从 ClaimsIdentity
.
public static class GenericIdentityExtensions {
/// <summary>
/// Return the Email claim
/// </summary>
public static string GetEmail(this IIdentity identity) {
if (identity != null && identity.IsAuthenticated) {
ClaimsIdentity claimsIdentity = identity as ClaimsIdentity;
if (claimsIdentity != null)
return claimsIdentity.FindFirstOrEmpty(Constants.Security.ClaimTypes.Email);
}
return string.Empty;
}
/// <summary>
/// Return the Email2 claim
/// </summary>
public static string GetEmail2(this IIdentity identity) {
if (identity != null && identity.IsAuthenticated) {
ClaimsIdentity claimsIdentity = identity as ClaimsIdentity;
if (claimsIdentity != null)
return claimsIdentity.FindFirstOrEmpty(Constants.Security.ClaimTypes.Email2);
}
return string.Empty;
}
/// <summary>
/// Retrieves the first claim that is matched by the specified type if it exists, String.Empty otherwise.
/// </summary>
internal static string FindFirstOrEmpty(this ClaimsIdentity identity, string claimType) {
var claim = identity.FindFirst(claimType);
return claim == null ? string.Empty : claim.Value;
}
}