Tag: 基于声明的身份

如何从ClaimsPrincipal中删除ClaimsIdentity

我有一个内置于ASP.Net MVC的HR Web应用程序,分为多个区域,例如Manager,Employee。 这些区域代表系统中能够执行不同任务的不同类型的用户。 涉及遗留数据库,每种用户类型的信息存储在不同的表中。 此外,为每种用户类型存储的信息类型也不同,因此表格是分开的。 我希望实现基于声明的身份validation有以下几个原因:一,在客户端上存储有关每个用户的详细信息(如用户名,角色等)会更容易。另一个原因是ClaimsPrincipal支持多个身份。 这很重要,因为在某些情况下,单个人可能需要同时在多个身份下访问系统。 例如。 Manager需要访问系统才能执行管理任务,但Manager也恰好是Employee,并且应该能够以Employee身份登录系统。 每个区域都是单独处理的,因此即使用户既是管理员又是员工,他们必须分别登录到每个区域。 所以这是我的问题:通过ClaimsPrincipal的多个身份是否可行? 我还有其他一些技巧吗? 如果要使用多个身份,如何将用户从一个区域中注销,但如果他们碰巧同时也登录到另一个区域,请让他们登录到另一个区域? 通常,要注销,代码看起来像这样: FederatedAuthentication.SessionAuthenticationModule.SignOut(); 我的假设是,这将使用户退出这两个区域。 它是否正确? 假设是这种情况,我想我可以简单地从ClaimsPrincipal中删除特定的Identity,然后重置并编写SessionSecurityToken,但ClaimsPrincipal没有remove方法,只有AddIdentity。 所以我提出了以下伪代码: 注销时: 计算ClaimsPrincipal中的身份数量 如果count == 1正常退出 如果count> 1,因为我们无法删除标识,循环标识并创建一个新的ClaimsPrincipal,排除我们要注销的标识,然后重置并写入SessionSecurityToken 我是在正确的轨道上吗? 是否有一些很好的例子说明如何在ClaimsPrincipal中实现多个身份? 我已经搜索过了,虽然我发现了多个身份的简要提及,但我没有找到实际的例子。

Web API 2 + MVC 5共享标识表

我有一个Web API和MVC5共享相同的身份表。 属于Web API的Context: public partial class CrestfineContext: IdentityDbContext { public CrestfineContext(): base(“WelbeckDatabase”, throwIfV1Schema: false) { } protected override void OnModelCreating(DbModelBuilder builder) { builder.Conventions.Remove(); builder.Entity().ToTable(“UserClaim”).HasKey(r => r.Id); builder.Entity().ToTable(“UserLogin”).HasKey(l => l.UserId); builder.Entity().ToTable(“Role”).HasKey(r => r.Id); builder.Entity().ToTable(“User”).HasKey(r => new{ r.IDNumber, r.UserName}); builder.Entity().ToTable(“User”).HasKey(r => r.UserName); builder.Entity().ToTable(“UserRole”).HasKey(r => new { r.RoleId, r.UserId });/**/ } 属于Web应用程序(MVC 5)的Context是: public partial class CrestfineContext […]

WIF身份委派给WebAPI REST服务

我读过这篇文章: 使用AD FS 2.0的身份委派分步指南 ,介绍如何使用WIF从ASP.NET应用程序到后端WCF服务执行身份委派。 我目前有一个ASP.NET WebAPI REST服务,我希望能够使用身份委派从我的ASP.NET应用程序调用,但我找不到任何有关如何实现此目的的信息。 上面提到的technet文章使用CreateChannelActingAs使用调用用户的安全令牌创建到WCF服务的通道,但显然这种方法不适用于REST API。 任何人都可以指向我任何文章或提供如何使用WIF将身份委托给我的REST服务的描述吗? 我的WebAPI REST服务应用程序已经在Thinktecture的这个库的帮助下使用WIF身份validation进行设置和工作。

如何避免’SamlAssertion.NotOnOrAfter条件不满意’错误

最近,我开始在现有的Web应用程序上使用基于声明的身份validation。 因为应用程序使用jQuery,尤其是AJAX函数,我不得不改变处理程序,不要尝试重定向XmlHTTPRequests ,而是返回403状态,这更容易处理。 这是FederatedAuthentication.WSFederationAuthenticationModule.AuthorizationFailed事件hanlder: protected void WSFederationAuthenticationModule_AuthorizationFailed(object sender, AuthorizationFailedEventArgs e) { //WSFederationAuthenticationModule sam = (WSFederationAuthenticationModule)sender; HttpContext context = HttpContext.Current; HttpRequest req = context.Request; HttpResponse resp = context.Response; if (req == null || resp == null) return; if ((resp.StatusCode == 302 || resp.StatusCode == 401) && req.Headers[“X-Requested-With”] == “XMLHttpRequest”) { resp.StatusCode = 403; e.RedirectToIdentityProvider = false; […]

使用特定计算机对域进行身份validation?

背景 我们正在转换到基于声明的auth在我们的应用程序中(在.NET 4.5上)我们目前通过Asp.net成员身份和域身份validation正常工作。 域部分看起来像这样(概括一点): var context = new PrincipalContext(ContextType.Domain, ADDomainName); return context.ValidateCredentials(username, password); 问题/目标 有时我们(或我们使用的一些顾问)使用的机器可以看到我们的域服务器,但不是我们域的成员。 从不在域上的计算机上测试应用程序,而不是必须启动域中的计算机以进行检查,这将是一个很大的帮助。 题 有没有办法从不在域上的计算机上对域控制器执行域身份validation? 到目前为止,我还没有找到任何研究。

如何从令牌中提取并获得声明?

我一直在寻找一个确切的答案,但似乎大多数答案是客户电话和超出范围。 问题:我已经拥有访问令牌访问令牌。 如何仅使用访问令牌使用c#代码获取声明? 我想:以下是相同的问题,但我认为没有答案。 如何从经过身份validation的SecurityToken中获取声明 如何从我的Oauth令牌中读取声明?

ASP.Net MVC:如何读取我的自定义声明值

请参阅以下代码。 我知道这样我们可以将自定义数据添加到声明中,但现在的问题是如何读回这些值。 说我想读回索赔的价值电子邮件和电子邮件2请告诉我需要写什么代码来回读索赔电子邮件和电子邮件2的值。 UserManager userManager = new UserManager(new UserStore(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));

在ASP.NET 5中使用声明与OpenIdConnect.Server

在过去的7天里,我尝试使用OpenIdConnect.Server和资源所有者流来设置ASP.NET 5 WebApi。 我在生成令牌和访问[Authorize]受保护的操作方面或多或少成功。 但是,当我尝试访问this.User.Identity.Claims ,它是空的。 我现在使用的是ASP.NET 5,beta6(升级到最近的beta7并等待它正式发布时遇到麻烦) 在Startup.cs中我得到了以下内容: public void ConfigureServices(IServiceCollection services) { services.AddCaching(); services.AddEntityFramework() .AddSqlServer() .AddDbContext(options => { options.UseSqlServer(Configuration.Get(“Data:DefaultConnection:ConnectionString”)); }); services.AddIdentity( options => options.User = new Microsoft.AspNet.Identity.UserOptions { RequireUniqueEmail = true, UserNameValidationRegex = “^[a-zA-Z0-9@_\\.-]+$” }) .AddEntityFrameworkStores() .AddDefaultTokenProviders(); services.ConfigureCors(configure => { configure.AddPolicy(“CorsPolicy”, builder => { builder.WithOrigins(“http:/localhost/”, “http://win2012.bludev.com/”); }); }); services.AddScoped(); } public void Configure(IApplicationBuilder […]

使用async / await设置Thread.CurrentPrincipal

下面是我试图在异步方法中将Thread.CurrentPrincipal设置为自定义UserPrincipal对象的简化版本,但是自定义对象在离开await后会丢失,即使它仍然在新的threadID 10上。 有没有办法在await中更改Thread.CurrentPrincipal并在以后使用它而不传入或返回它? 或者这不安全,永远不应该是异步的? 我知道有线程更改,但认为async / await将为我处理同步。 [TestMethod] public async Task AsyncTest() { var principalType = Thread.CurrentPrincipal.GetType().Name; // principalType = WindowsPrincipal // Thread.CurrentThread.ManagedThreadId = 11 await Task.Run(() => { // Tried putting await Task.Yield() here but didn’t help Thread.CurrentPrincipal = new UserPrincipal(Thread.CurrentPrincipal.Identity); principalType = Thread.CurrentPrincipal.GetType().Name; // principalType = UserPrincipal // Thread.CurrentThread.ManagedThreadId = 10 }); principalType […]

‘AspNetUser’类型的属性’Claims’不是导航属性

我正在使用ASP.NET Identity 2.2。 我正在将ASP.NET旧成员身份迁移到新的身份系统。 我按照本文中提到的步骤执行迁移。 我扩展了IdentityUser并添加了更多属性,如下所示: public partial class AspNetUser : IdentityUser { public AspNetUser() { CreateDate = DateTime.Now; IsApproved = false; LastLoginDate = DateTime.Now; LastActivityDate = DateTime.Now; LastPasswordChangedDate = DateTime.Now; LastLockoutDate = DateTime.Parse(“1/1/1754”); FailedPasswordAnswerAttemptWindowStart = DateTime.Parse(“1/1/1754”); FailedPasswordAttemptWindowStart = DateTime.Parse(“1/1/1754”); Discriminator = “AspNetUser”; LastModified = DateTime.Now; this.AspNetUserClaims = new HashSet(); this.AspNetUserLogins = new HashSet(); this.AspNetRoles […]