OAuth - 读取生成的Access令牌并添加cookie作为响应

时间:2016-04-22 11:09:54

标签: asp.net-web-api oauth

我在ASP.NET Web Api中使用OAuth将访问令牌返回给应用程序的调用者。

我从OAuthAuthorizationServerProvider继承了我的OAuth提供程序类,一旦用户在GrantResourceOwnerCredentials函数内进行了身份验证,我想读取生成的访问令牌,用一些盐创建它的哈希值value,然后将创建的哈希添加到cookie中。

以下是我的GrantResourceOwnerCredentials功能的简化定义。

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
{
    var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>();

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

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

    ClaimsIdentity oAuthIdentity = await user.GenerateUserIdentityAsync(userManager, OAuthDefaults.AuthenticationType);
    ClaimsIdentity cookiesIdentity = await user.GenerateUserIdentityAsync(userManager, CookieAuthenticationDefaults.AuthenticationType);

    //Add claims required on client side.
    AuthenticationProperties properties = CreateProperties(user.UserName);
    AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);

    //Generate the token behind the scene for given ticket
    context.Validated(ticket);        
    context.Request.Context.Authentication.SignIn(cookiesIdentity);
    SetCsrfCookie(context);
}

private void SetCsrfCookie(OAuthGrantResourceOwnerCredentialsContext context)
{        
    var accessToken = "<READ THE GENERATED ACCESS TOKEN HERE>";      //<------ How?
    if(string.IsNullOrEmpty(accessToken)) return;

    var csrfToken = Helper.GetHash(accessToken);
    context.Response.Cookies.Append("XSRF-TOKEN", csrfToken, new CookieOptions {HttpOnly = false});
}

我在这里遇到两个问题。

  1. 首先是如何在上面的代码中的SetCsrfCookie函数中读取生成的访问令牌。
  2. 客户端未收到生成的cookie。
  3. 我知道有可能在某个OwinMiddleware继承的类中拦截响应然后我可以生成所需的cookie并附加到响应但是首先我没有尝试过,其次,它似乎更好在我的OAuth提供程序类中处理此案例的选项,因为有人建议从OwinMiddleware派生并不是一个好习惯。

1 个答案:

答案 0 :(得分:0)

我终于设法通过在角边添加以下代码行来修复cookie问题

*{box-sizing:border-box;margin:0;padding:0;}
html,body{height:100%}
div{
  background:#000;
  border:1px solid #fff;
  transition:top 2s linear; /* Using a transition instead of an animation */
  position:absolute;
}

在Web Api方面,我只是将$httpProvider.defaults.withCredentials = true; 响应标头设置为Access-Control-Allow-Credentials方法中的true,如下所示:

WebApiConfig.Register

这解决了我的cookie问题。

为了访问生成的访问令牌,我从var cors = new EnableCorsAttribute(ConfigurationManager.AppSettings["ALLOWED_ORIGIN"], "*", "*") { SupportsCredentials = true }; config.EnableCors(cors); 继承了一个类,并在Invoke函数内部访问响应主体以读取访问令牌,如下所示:

OwinMiddleware