Web Api OWIN - 如何在每个请求上验证令牌

pau*_*sim 9 c# asp.net-web-api owin http-token-authentication

我有两个申请

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

计划身份验证如下

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

现在,在关闭应用程序的服务器端,我需要确认每个请求的令牌都没有被篡改.

  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);

        }
    }
Run Code Online (Sandbox Code Playgroud)

请帮忙,

谢谢,

@保罗

Mar*_*und 3

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

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

然后使用该Authorize属性来决定哪些用户在某些端点上获得授权。以下是允许具有“user”角色的用户访问的示例

[Authorize(Roles="user")]
public class ValuesController : ApiController
{
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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