相关疑难解决方法(0)

访问AccountController外部的UserManager

我试图aspnetuser从不同的控制器(而不是accountcontroller)设置表中的列的值.我一直试图访问,UserManager但我不知道如何做到这一点.

到目前为止,我已经在控制器中尝试了以下内容我想用它:

    ApplicationUser u = UserManager.FindById(User.Identity.GetUserId());
    u.IsRegComplete = true;
    UserManager.Update(u);
Run Code Online (Sandbox Code Playgroud)

这不会编译(我想因为UserManager还没有实例化控制器)

我还尝试创建一个公共方法,AccountController以接受我想要更改值的值并在那里做,但我无法弄清楚如何调用它.

public void setIsRegComplete(Boolean setValue)
{
    ApplicationUser u = UserManager.FindById(User.Identity.GetUserId());
    u.IsRegComplete = setValue;
    UserManager.Update(u);

    return;
}
Run Code Online (Sandbox Code Playgroud)

如何访问和编辑帐户控制器之外的用户数据?

更新:

我尝试在其他控制器中实例化UserManager,如下所示:

    var userManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(db));
    ApplicationUser u = userManager.FindById(User.Identity.GetUserId());
Run Code Online (Sandbox Code Playgroud)

我的项目符合(有点兴奋),但当我运行代码时,我收到以下错误:

Additional information: The entity type ApplicationUser is not part of the model for the current context.
Run Code Online (Sandbox Code Playgroud)

更新2:

我已将该功能移至IdentityModel(不要问我在这里抓住吸管),如下所示:

   public class ApplicationUser : IdentityUser
    {
        public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc actioncontroller asp.net-mvc-5 asp.net-identity-2

28
推荐指数
2
解决办法
3万
查看次数

如何从ClaimsPrinciple中删除现有声明?

我正在制作一个开发人员工具来模仿RolesIntranet站点,以便开发人员能够Role根据需要快速执行任何操作.定义的角色Developer, Team Lead, Team Member, Engineering, Marketing, Guest,并在网页上的工具向Web API的调用来添加或删除的Claim...好,我可以添加,但似乎无法找出的.RemoveClaim(claim).TryRemoveClaim(claim)可以访问得到这个工作.我是否必须创建自定义声明管理器才能获得此功能,或者我是否遗漏了某些内容?

我一直在关注System.Security.Claims,几乎所有其他东西似乎都非常简单,并且没有任何参考需要大量工作来完成我需要的工作.

我在.NET 4.5.1中使用VS 2013/Web Api2.

网站方面只是使用简单的ajax调用PUTDELETE功能,直到我按照我想要的方式工作.从Controller,我的cs代码如下:

    public void Put(int id, [FromBody]string role)
    {
        if (FindClaim(role) != null) return;

        var user = HttpContext.Current.User as ClaimsPrincipal;
        if (user == null) return;

        var claimId = new ClaimsIdentity();
        claimId.AddClaim(new Claim(ClaimTypes.Role, role));
        user.AddIdentity(claimId);
    }

    // DELETE api/devroleadjuster/5
    public void Delete(int id, [FromBody]string role)
    {
        var claim = FindClaim(role); …
Run Code Online (Sandbox Code Playgroud)

c# claims-based-identity wif asp.net-web-api

24
推荐指数
2
解决办法
2万
查看次数

在MVC应用程序中使用WIF创建自定义标识的位置?

在WIF之前,Application_PostAcquireRequestState是创建自定义标识的好地方,但需要大量框架来确保您正在进行的每种类型的身份验证都已正确映射.通过自定义标识,我的意思是继承自Identity的类,例如下面的SomeIdentity,这样我们就可以拥有一个特定的属性,我们可能需要所有经过身份验证的用户拥有.

PostAcquirerequestState仍然可用,但是有很多新方法可以挂钩进行身份验证.此外,支持多种身份验证方法时,旧方法变得复杂.

我想知道在WIF中是否有比下面更好的方法来实现这一点.主要是我想将处理映射声明的代码分离出来.这个想法是代码对于其他身份验证类型/提供者而言是不同的,因为它检索该属性值的方式可能不是来自诸如SAML的声明,而是来自其他地方的其他类型的身份验证方法.我Kentor.AuthServices目前正在使用SAML支持.虽然可能有不同的代码用于根据提供程序映射这些值,但最终结果是已创建SomeIdentity实例并且将设置SomeProperty和其他属性.这样,应用程序的其余部分总是可以依赖/假设已经处理过.

我的MVC项目想出了一个AccountController即有ExternalLoginCallback其隐含的可能是,当外部认证结束一个良好的钩的名字(这对我SAML是"外部"认证).但是,在SAML身份验证期间/之后的任何时候似乎都没有受到攻击.

可能答案是我们仍然需要以旧方式将它们拼凑在一起,但我希望WIF有一些更好的框架钩子来使这更容易.

public sealed class SomeIdentity : Identity
{
  ...
  // Some custom properties
  public string SomeProperty { get;set;}
}

protected void Application_PostAcquireRequestState(object sender, EventArgs e)
{
  ...
  identity = new SomeIdentity(id, userId);
  // map a claim to a specific property
  identity.SomeProperty = ...Claims[IdpSomePropertyKey];
  ///...

  GenericPrincipal newPrincipal = new GenericPrincipal(identity , null);
  HttpContext.Current.User = newPrincipal;
  System.Threading.Thread.CurrentPrincipal = newPrincipal;
}
Run Code Online (Sandbox Code Playgroud)

现在我正在使用WIF,我应该在哪里放置特定于特定身份验证类型的代码(即Kentor.AuthServices SAML)来创建自定义SomeIdentity?

我的想法是,SomeIdentity将是我的应用程序中随处使用的标识类,但是填充它的属性的代码将需要专门针对每种身份验证类型编写,例如使用SAML来提取声明并使用它们的值来设置proeprties.即它是映射发生的地方.

wif

10
推荐指数
1
解决办法
368
查看次数

如何追踪过期的WIF fedauth cookies?

尝试跟踪过期的WIF身份验证会话/ cookie时,我遇到了一个有趣的问题.

作为一个背景:该站点是MVC 3,使用与ADFS服务器作为STS信任的Windows Identity Foundation(WIF).整个站点受SSL保护.STS将令牌到期时间设置为60分钟.

当用户手动注销时,我们只需在FedAuth模块上调用SignOut方法:

FederatedAuthentication.WSFederationAuthenticationModule.SignOut(false);
Run Code Online (Sandbox Code Playgroud)

这当然会删除FedAuth cookie,但问题出现在这里.如果我用Fiddler捕获这些cookie,我可以在它们的到期时间内将它们重新呈现给网站,并且仍然被视为已登录.

我意识到这是从浏览器的特权位置执行,已经接受了小提琴作为代理...但是客户担心那些实际上没有过期的身份验证cookie会带来很大的安全风险.他们不相信SSL足以保护网站,如果攻击者可以执行MITM攻击,他们可以在用户认为已经注销后使用这些cookie.

我已经解释过如果他们在注销后容易受到攻击,他们在登录时很容易受到攻击,但是他们并不关心...

所以我一直在寻找方法来确保一旦用户注销,与该登录会话相关联的fedauth cookie将被视为已过期.WIF处理程序似乎没有用于跟踪过期令牌的内置机制,我还没有找到与此相关的任何其他内容.

我想这实际上是一个更广泛的问题 - >如何检测一般过期的cookie?有效的cookie是有效的cookie!

显而易见的解决方案是以某种方式在注销后跟踪这些cookie,但是如果可能的话我想避免使用自定义代码路由; 作为一个菜鸟,许多安全文献都说要避免自定义编码任何类型的会话机制,因为你可能会弄错它!

是否有人知道ASP.NET中的任何标准解决方案?

提前致谢.

asp.net asp.net-mvc wif

5
推荐指数
1
解决办法
2092
查看次数

C# Web API 更新声明

我制作 asp.net web api 项目。
客户端程序是winform使用HttpClient。
当用户登录时,我将用户语言分配给声明。

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
    .......
    var identity = new ClaimsIdentity(context.Options.AuthenticationType);
                identity.AddClaim(new Claim("UserId", context.UserName));
                identity.AddClaim(new Claim("role", "user"));
                identity.AddClaim(new Claim("Language", forms["language"]));
    context.Validated(identity);
   ......
}
Run Code Online (Sandbox Code Playgroud)

我需要更改索赔运行时的语言。所以我做了更改语言API。

    [HttpGet]
    [APIAuthorize]
    public HttpResponseMessage ChangeLanguage(Language language)
    {
        User.AddUpdateClaim("Language", language.ToString());

        return Request.CreateResponse<IResult>(HttpStatusCode.OK, "OK");
    }
Run Code Online (Sandbox Code Playgroud)

并进行 ClaimsIdentity 扩展。

public static class ClaimsIdentityExtensions
{
    public static void AddUpdateClaim(this IPrincipal currentPrincipal, string key, string value)
    {
        var identity = new ClaimsIdentity(currentPrincipal.Identity);            
        // check for existing claim and remove it
        var existingClaim …
Run Code Online (Sandbox Code Playgroud)

c# asp.net claims-based-identity asp.net-web-api asp.net-web-api2

5
推荐指数
0
解决办法
1373
查看次数

ASP.NET标识:修改声明后不更新cookie

我在.Net 4.6.2/MVC5中更新ASP.Net Identity 2.2.1的声明时遇到问题.更新声明后,它通常会向浏览器发送更新的cookie,一切正常,但有时没有设置cookie标头发送到浏览器.

我无法确定何时发生任何模式,而不是在发生故障时,服务器正在发送

Persistent-Auth: true
Run Code Online (Sandbox Code Playgroud)

会话中每个响应的http标头值.我不知道是什么原因导致此标头值被设置并且它有时会出现在会话中间,一旦它开始发送它,它将被发送到会话的其余部分并且尝试更新声明将永远不会再次为该会话工作.

据我所知,我在每次调用ASP.Net标识时都将isPersistent参数硬编码为false,我看不到任何可能与此标头相关的内容.

我用来更新声明的代码是

public static void UpdateClaims(List<Claim> claims)
{
    var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
    var newIdentity = new ClaimsIdentity(HttpContext.Current.User.Identity);

    foreach (Claim claim in claims)
    {
        Claim oldClaim = newIdentity.FindFirst(claim.Type);
        if (oldClaim != null && oldClaim.Type != "")
        {
            newIdentity.RemoveClaim(oldClaim);
        }
        newIdentity.AddClaim(claim);
    }
    authenticationManager.AuthenticationResponseGrant = new AuthenticationResponseGrant
          (new ClaimsPrincipal(newIdentity), new AuthenticationProperties { IsPersistent = false });
}
Run Code Online (Sandbox Code Playgroud)

这是从MVC动作方法调用的.

有没有人有什么建议可能会出问题,甚至只是一个起点在哪里看?我不知道是什么导致持久性auth标头,但它看起来与问题有关; 无论是问题的原因还是症状,我都不知道.

我正在使用ASP.Net Identity 2.2.1和.Net 4.6.2.我在Windows Server 2012R2上运行,IE11,Chrome和Firefox似乎也出现了这个问题.我正在使用Fiddler 4.6.3来查看http标头/响应.

更新:我注意到只有在启用Windows身份验证时才会出现问题.我的服务器有一个允许用户名/密码,Windows身份验证或两者的设置(用户可以选择使用用户名/密码以其他用户身份登录).当使用windows auth时,我最初使用Windows对用户进行身份验证,然后设置一个cookie,然后我将其用于会话中的所有未来请求.如果禁用了Windows身份验证,则更新此类声明始终有效.如果启用了Windows身份验证,则更新声明通常有效.

c# asp.net asp.net-mvc asp.net-identity

0
推荐指数
2
解决办法
5094
查看次数