Oauth 2.0 承载令牌身份验证和密码更改

Oauth 2.0 承载令牌身份验证和密码更改,oauth-2.0,owin,asp.net-web-api2,bearer-token,Oauth 2.0,Owin,Asp.net Web Api2,Bearer Token,现在我正在学习Web API中的owin承载令牌身份验证。代码是通过基于令牌和cookie的身份验证实现的。代码是 public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) { try { using (UserManager<ApplicationUser>

现在我正在学习Web API中的owin承载令牌身份验证。代码是通过基于令牌和cookie的身份验证实现的。代码是

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
    {
        try
        {

              using (UserManager<ApplicationUser> userManager = userManagerFactory())
                {

                    ApplicationUser user = await userManager.FindAsync(context.UserName, context.Password);


                    if (user == null || user.IsDeleted)
                    {
                        context.SetError("invalid_grant", "The user name or password is incorrect.");
                        return;
                    }

                    ClaimsIdentity oAuthIdentity = await userManager.CreateIdentityAsync(user,
                        context.Options.AuthenticationType);
                    ClaimsIdentity cookiesIdentity = await userManager.CreateIdentityAsync(user,
                        CookieAuthenticationDefaults.AuthenticationType);

                    var roleName = await GetRoleName(user.Roles.First().RoleId);

                    AuthenticationProperties properties = CreateProperties(user.UserName, roleName);
                    AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
                    context.Validated(ticket);
                    context.Request.Context.Authentication.SignIn(cookiesIdentity);
                }

        }
        catch (Exception ex)
        {

            throw ex;
        }
    }

        public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
        {
            // Resource owner password credentials does not provide a client ID.
            if (context.ClientId == null)
            {
                context.Validated();
            }

            return Task.FromResult<object>(null);
        }

        public override Task ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext context)
        {
            if (context.ClientId == _publicClientId)
            {
                Uri expectedRootUri = new Uri(context.Request.Uri, "/");

                if (expectedRootUri.AbsoluteUri == context.RedirectUri)
                {
                    context.Validated();
                }
            }

            return Task.FromResult<object>(null);
        }
public override异步任务GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext)
{
尝试
{
使用(UserManager UserManager=userManagerFactory())
{
ApplicationUser user=await userManager.FindAsync(context.UserName,context.Password);
if(user==null | | user.IsDeleted)
{
SetError(“无效的授权”,“用户名或密码不正确”);
返回;
}
ClaimsIdentity oAuthIdentity=等待userManager.CreateIdentityAsync(用户,
context.Options.AuthenticationType);
ClaimsIdentity cookiesIdentity=await userManager.CreateIdentityAsync(用户,
CookieAuthenticationDefaults.AuthenticationType);
var roleName=await GetRoleName(user.Roles.First().RoleId);
AuthenticationProperties=CreateProperties(user.UserName,roleName);
AuthenticationTicket=新的AuthenticationTicket(OAuthidentitity,属性);
上下文。已验证(票证);
context.Request.context.Authentication.sign(cookiesIdentity);
}
}
捕获(例外情况除外)
{
掷骰子;
}
}
公共覆盖任务ValidateClientAuthentication(OAuthValidateClientAuthenticationContext)
{
//资源所有者密码凭据不提供客户端ID。
if(context.ClientId==null)
{
context.Validated();
}
返回Task.FromResult(空);
}
公共覆盖任务ValidateClientRedirectUri(OAuthValidateClientRedirectUriContext上下文)
{
if(context.ClientId==\u publicClientId)
{
Uri expectedRootUri=新Uri(context.Request.Uri,“/”;
if(expectedRootUri.AbsoluteUri==context.RedirectUri)
{
context.Validated();
}
}
返回Task.FromResult(空);
}
代码是由同事实现的,我有一些疑问

  • 令牌身份验证基于生成的令牌。我为我的用户生成了一个令牌,其角色是“Admin”。现在我可以访问受限操作,因为用户具有“管理员”角色。但在那之后,我将同一个老用户的角色更改为“User”。现在使用相同的旧令牌,我可以访问资源,即使他现在不在“Admin”中。实际上,我读过一些文章,说这是用额外的自定义逻辑实现的。没关系

  • 现在我将用户密码更改为其他密码。现在,我可以使用相同的旧令牌访问资源。我认为这是不好的,即使我创造了短暂的代币也


  • 有人请你带我去逮捕他,否则我会错过什么吗?当我调用带有“Authorization”头的操作时,实际调用的方法是什么?没有“直接”方法来撤销授予的访问令牌或进行“注销”。如果用户拥有令牌,则他可以访问受保护的服务器资源,直到令牌过期。间接的方法是将授予用户的每个令牌的令牌\ id存储在数据库中,并对每个调用进行DB检查,这是我不推荐的

    因此,在某些情况下,最好将刷新令牌与访问令牌一起使用。因此,您发出短期访问令牌(15)分钟,并使用刷新令牌获取新的访问令牌。这里的好处是,可以从后端系统撤销刷新令牌,这样就可以对它们进行控制


    查看我关于如何启用OAuth的帖子

    hi taiseer,谢谢。我已经读过你所有的文章,都是关于这一点的,只有我通过刷新令牌才能做到这一点。我只是在这里询问其他选项,因为即使刷新令牌是15分钟,15分钟内的任何更改都无法处理。只是为了清理