首页 > 解决方案 > Web Api OWIN - 如何在每个请求上验证令牌

问题描述

我有两个应用程序

  1. 基于 ASP.NET MVC 构建的客户端应用程序
  2. 基于 Web API + OWIN 构建的身份验证服务器

已计划认证如下

  1. 对于用户登录客户端应用程序将使用登录凭据向身份验证服务器发出请求。
  2. 身份验证服务器将生成一个令牌并将其发送回客户端应用程序。
  3. 客户端应用程序将该令牌存储在本地存储中。
  4. 对于每个后续请求,客户端应用程序将附加令牌保存在请求标头中的本地存储中。

现在,在 CLEINT 应用程序的服务器端,我需要验证每个请求都附带的令牌没有被调和。

  1. 请建议我如何在每个请求中验证令牌,因为我不知道 OWIN 用于生成令牌的密钥。
  2. 编写代码来验证客户端应用程序上的令牌是正确的,或者它应该在身份验证服务器上。
  3. 我计划转移所有用户管理代码,例如注册用户,将密码更改为身份验证服务器,以便我们可以将其重新用于不同的客户端应用程序 - 这是正确的设计实践吗?

到目前为止,我已经编写了以下代码来创建 POC。

==========================OWIN配置========

    [assembly: OwinStartup(typeof(WebApi.App_Start.Startup))]
    namespace WebApi.App_Start
    {
        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                HttpConfiguration config = new HttpConfiguration();

                ConfigureOAuth(app);

                WebApiConfig.Register(config);
                app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
                app.UseWebApi(config);
            }

            public void ConfigureOAuth(IAppBuilder app)
            {
                OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
                {
                    AllowInsecureHttp = false,
                    TokenEndpointPath = new PathString("/token"),
                    AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
                    Provider = new SimpleAuthorizationServerProvider(),

         };

         // Token Generation

                app.UseOAuthAuthorizationServer(OAuthServerOptions);
                app.UseOAuthBearerAuthentication(new 
 OAuthBearerAuthenticationOptions());

            }
        }
    }

==============================oAuth Provided========================

 public class SimpleAuthorizationServerProvider: OAuthAuthorizationServerProvider
    {
        public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
        {
            context.Validated(); 
        }

        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {


            context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

            using (AuthRepository _repo = new AuthRepository())
            {
                IdentityUser user =  _repo.FindUser(context.UserName, context.Password);

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

            var identity = new ClaimsIdentity(context.Options.AuthenticationType);
            identity.AddClaim(new Claim("sub", context.UserName));
            identity.AddClaim(new Claim("role", "user"));

            context.Validated(identity);

        }
    }

请帮忙,

谢谢,

@保罗

标签: c#asp.net-web-apiowinhttp-token-authentication

解决方案


请建议我如何在每个请求中验证令牌,因为我不知道 OWIN 用于生成令牌的密钥。

您当前的设置(如果您已将 owin 管道添加app.UseOAuthBearerAuthentication()到 owin 管道)将通过在每个请求中为您传递的不记名令牌对用户进行身份验证。然后可以通过 找到当前用户HttpContext.Current.User

然后使用该Authorize属性决定哪些用户在某些端点上被授权。这是一个示例,其中允许具有“用户”角色的用户访问

[Authorize(Roles="user")]
public class ValuesController : ApiController
{
}

编写代码来验证客户端应用程序上的令牌是正确的,或者它应该在身份验证服务器上。

,您不会在客户端验证令牌,如果您的用户凭据错误,您根本不会获得令牌。这就是你需要知道的。 而且,为什么要在客户端验证令牌?

我计划转移所有用户管理代码,例如注册用户,将密码更改为身份验证服务器,以便我们可以将其重新用于不同的客户端应用程序 - 这是正确的设计实践吗?

重用令牌提供者很常见。为什么要为每个应用程序发明轮子?构建一个伟大的,或使用第三方,并在您的应用程序中重用它。


推荐阅读