我在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});
}
我在这里遇到两个问题。
SetCsrfCookie
函数中读取生成的访问令牌。我知道有可能在某个OwinMiddleware
继承的类中拦截响应然后我可以生成所需的cookie并附加到响应但是首先我没有尝试过,其次,它似乎更好在我的OAuth提供程序类中处理此案例的选项,因为有人建议从OwinMiddleware
派生并不是一个好习惯。
答案 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