2017-02-15 53 views
0

语境如何自定义WebApi OAuth令牌验证?

我有一个工作WebApi2应用程序,它采用了承载令牌验证框,就像是在原来的Visual Studio项目模板。

我想添加一个自定义数据到生成的令牌,然后检查该自定义数据时,随后的api调用发生什么呈现此令牌。

为了举例说明,我希望在创建令牌时存储调用者的IP地址,然后在验证令牌时检查使用令牌的调用是否具有相同的IP。

我发现自定义类

public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider 

在我的项目,我也看到OAuthOptions被配置为使用自定义类在启动时。

我想在哪里添加我的自定义标记数据(IP):

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 

在这里我可以把它添加到售票属性自定义数据。

问题

但是我无法找出什么方法来核对令牌有这个数据,和它匹配的实际通话的IP,如果没有,则认为该令牌无效?

回答

2

当你决定执行OAuthAuthorizationServerProvider时,你是绝对正确的。现在,你需要添加像这样:

 private ClaimsIdentity CreateIdentity(User user, string authenticationType) 
    { 
     var identity = new ClaimsIdentity(authenticationType); 

     identity.AddClaim(new Claim(ClaimTypes.Name, user.Login)); 
     identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.UserID.ToString())); // or ip instead of user.UserID if you need 
     return identity; 
    } 

,然后在Grant...方法使用它(例如GrantResourceOwnerCredentials)是这样的:

 ClaimsIdentity identity = CreateIdentity(user, context.Options.AuthenticationType); 
     context.Validated(identity); 

然后,当请求来到你的WebAPI控制器,你可以查您的数据在您的自定义属性:

  Claim userIdClaim = ((ClaimsIdentity)actionContext.ControllerContext.RequestContext.Principal.Identity) 
      .Claims 
      .FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier); 

希望它有帮助。

+0

剩余在IP示例中,我不清楚在哪里,何时以及如何检查存储的IP,并且_reject_请求无效? –

+0

@ g.pickardou在用户通过授权并将他的ip保存在声明中后,您可以创建自己的属性(继承ActionFilterAttribute)来验证传入的请求。然后在OnActionExecuting中,您可以编写: – grbulat

+0

'var owinContext =(OwinContext)actionContext.Request.Properties [“MS_OwinContext”]; string ip = owinContext.Request.RemoteIpAddress; 权利要求userIpClaim =((ClaimsIdentity)actionContext.ControllerContext.RequestContext.Principal.Identity) .Claims .FirstOrDefault(C => c.Type == ClaimTypes.NameIdentifier); 如果(userIpClaim == NULL \t \t && string.CompareOrdinal(userIpClaim.Value,IP)!= 0){ actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode。未经授权); return; }' – grbulat