- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
让我全神贯注于新的身份框架,并试图弄清楚如何最好地处理自定义用户属性。我已经尝试扩展 IdentityUser,它用于存储信息,但到目前为止需要额外的数据库调用才能恢复属性。我正在考虑改用声明来存储/检索此信息。
首先,我要存储/检索的特定 prop 不是单个用户所独有的(多对一)。考虑在自定义组结构中将用户分组在一起。我想存储 GroupId 以便在其他相关实体中使用。
我能够存储 GroupId(目前使用 ClaimTypes.NameIdentifier,我认为它不是该类型的正确用法,但是...)。但是,当我去检索该值时,在声明集合中找不到声明类型。它在数据库中,所以我知道它在那里。我错过了一些东西。
FWIW:因为它是 WebAPI,所以我没有使用传统的登录方式。我正在使用 token 授权。
当我创建用户时,我有类似的东西:
public async Task<IdentityResult> CreateUserAsync(string email, string password, string groupId)
{
var userId = ObjectId.GenerateNewId(DateTime.UtcNow).ToString(); // yes, it's a NoSQL store
var user = new ApplicationUser
{
Id = userId,
UserName = email
};
var claim = new IdentityUserClaim { ClaimType = ClaimTypes.NameIdentifier, ClaimValue = groupId, UserId = userId, Id = ObjectId.GenerateNewId(DateTime.UtcNow).ToString() };
user.Claims.Add(claim);
var result = await _UserManager.CreateAsync(user, password);
return result;
}
这会创建一个看起来合适的数据库条目。
当我检索值时,出现空引用错误。这是通过扩展方法编写的代码:
public static string GetGroupId(this IIdentity identity)
{
var claimsIdentity = identity as ClaimsIdentity;
return claimsIdentity == null ? "" : claimsIdentity.FindFirst(ClaimTypes.NameIdentifier).Value;
}
尝试获取值时发生错误,因为 FindFirst 返回空值。
如有任何提示或更好/最佳实践,我们将不胜感激!老实说,我更愿意将它存储在 ApplicationUser : IdentityUser
对象上,但我找不到一种简单的方法来检索 User.Identity 在我的 api Controller 上下文中,而无需额外调用数据库。
最佳答案
您关于将额外数据存储为声明的直觉是正确的,但实现起来有点问题。
我建议为您的域信息创建您自己的声明类型。不要重用框架提供的声明类型。原因是 ClaimTypes.NameIdentifier
代表 User.Id。该框架本身为所有用户添加了标准声明列表:
ClaimTypes.NameIdentifier
ClaimTypes.ProviderName
(对此不是 100% 确定);通常值为“ASP.NET Identity”ClaimTypes.Role
因此,在您的情况下,您尝试用 User.Id
的值覆盖声明,这非常重要,我认为 -)
现在,让我们尝试解决您的编码问题。创建用户时,在创建用户对象后添加声明:
public async Task<IdentityResult> CreateUserAsync(string email, string password, string groupId)
{
var user = new ApplicationUser
{
Id = userId,
UserName = email
};
var userCreateResult = await _UserManager.CreateAsync(user, password);
if(!userCreateResult.IsSuccess)
{
// user creation have failed - need to stop the transaction
return userCreateResult;
}
// better to have a class with constants representing your claim types
var groupIdClaim = new Claim("MyApplication:GroupClaim", ObjectId.GenerateNewId(DateTime.UtcNow).ToString());
// this will save the claim into the database. Next time user logs in, it will be added to Principal.Identity
var claimAddingResult = await _UserManager.AddClaimAsync(userId, groupIdClaim);
return claimAddingResult;
}
至于扩展方法,我通常使用 IPrincipal
或 ClaimsPrincipal
。但是 IIdentity
也是可行的。不要忘记,您可以通过调用 ClaimsPrincipal.Current
在任何地方访问 ClaimsPrincipal
。
这就是我通常使用扩展方法的方式:
public static string GetGroupId(this ClaimsPrincipal principal)
{
var groupIdClaim = principal.Claims.FirstOrDefault(c => c.Type == "MyApplication:GroupClaim");
if (personIdClaim != null)
{
return groupIdClaim.Value;
}
return String.Empty;
}
因此在您的方法中,您会像这样为当前登录的用户检索分配的 groupId
:
var groupId = ClaimsPrincipal.Current.GetGroupId();
希望这能澄清您的困惑!
关于c# - 使用 OWIN Identity v2 Claims 跟踪 WebAPI2 应用程序中的自定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25328717/
我正在构建一个 MVC 5 应用程序。我需要根据 AD 和 sql 数据库或 Web 服务对人员进行身份验证。 要求是如果一个人登录到公司网络或通过 VPN 连接,我必须在不要求凭据的情况下登录它们。
有没有办法从 WindowsAzureActiveDirectoryBearerAuthenticationOptions 等扩展中调试 OWIN 中间件,并确切了解请求被拒绝的原因(例如,没有 to
我们对 Nancy/Owin 托管的 api 有一种奇怪的体验 - 当 URL 查询字符串超过 255 个字符时,Nancy 返回 400 Bad Request。 知道如何解决这个问题吗? 最佳答案
正确的处理方式是什么Content-Length在 Owin 中间件中编写正文内容时? 目前我们正在使用 context.Response.Write(data); // data is a stri
我目前正在构建一个包含多个 OWIN 中间件的库。这些中间件应该按照一定的顺序执行。在 OWIN 的第一个版本中,有 IAppBuilder界面。然而IAppBuilder不再是 OWIN 的一部分,
我们的 Mvc/WebAPI 解决方案目前有四个我们已在 ADFS3 中注册的可信身份提供者。我们的用户可以通过直接链接使用这些身份提供者中的每一个,有效地解决 ADFS 可能创建的任何家庭领域 co
实际上我知道有关于 KATANA 好处的主题和问题,我知道它们,但我的问题是 Katana 在业务方面可以为我做什么?比如为什么我应该使用 WEB API 作为一个单独的模块(中间件)?它可以与哪个中
IOwinContext 中似乎没有 HTTP Referrer,我需要捕获它。获取该特定变量的正确方法是什么? IOwinContext 有几个 Typed PEM,但我没有特别看到 referer
我正在开发一个使用 Katana 公开自托管 WebAPI 服务的应用程序。我想以类似于 IIS 允许单个网站下的多个应用程序的方式来管理内容。 例如,我可能有三个包含 web api 内容的文件夹:
从 asp.net 6 开始,将没有名为 global.asax 的文件,但 global.asax 有许多事件,例如 · Application_Init · 申请_开始 · Session_Sta
我从 http://blogs.msdn.com/b/webdev/archive/2013/11/22/debugging-owin-app-or-framework.aspx 得到了演示代码,它显
我正在使用 Facebook Owin 身份验证并或多或少地遵循 Microsoft 示例。我或多或少地关注第一次用户登录,一切正常。但如果他们退出并重试,似乎之前的 .AspNet.Correlat
我已经阅读了很多关于此的帖子,但仍然无法使其正常工作。我正在使用 Visual Studio 2013。我创建了一个新的 MVC 5 项目,并认为使用新的 facebook 登录集成会很酷。它在我的
在使用 OWIN 请求管道创建 ApplicationUserManager 时,我在使用依赖注入(inject)创建自定义 UserStore 时遇到问题。 背景 我正在尝试将 Web 应用程序中的
我试图了解 Microsoft.Owin.Security.ActiveDirectory 的用途,但似乎找不到任何文档、测试,甚至 much以文章的方式。 这个包的实际用途是什么?我试图使用它来创建
如果我使用 OwinMiddleware 和 IOwinContext 等 Microsoft.Owin 类型构建 OWIN 中间件,我的中间件是否可以与非 Microsoft Owin 主机/服务器
我在 IIS 7.5 中部署了一个 Owin 中间件身份验证项目作为 Web 应用程序但问题是 Startup.cs 没有被调用。 [assembly: OwinStartup(typeof(Auth
据我所知Microsoft.Owin.Host.SystemWeb允许我在 IIS 上运行 OWIN 应用程序,但今天我发现了另一个名为 Microsoft.Owin.Host.IIS 的包(据我从其
有谁知道将 Owin Asp.Net Identity Cookie 身份验证(本地数据库)与 Owin OpenId 身份验证(云)混合的一个很好的例子?然后用户可以选择通过创建新用户和密码(存
我将 MVC 5 与 OWIN 身份验证一起使用。 这是我的 StartUp.cs 的代码。 public void ConfigureAuth(IAppBuilder app) {
我是一名优秀的程序员,十分优秀!