我设法让一个承载令牌在api项目中工作。
在我的解决方案中,我有2个项目api和mvc应用程序。 api处理承载令牌的认证和生成。
我想从mvc应用程序调用api进行身份验证,并能够设置auth cookie以用于mvc应用程序。
我的网络应用程序没有标准的帐户控制器操作。我已删除所有操作,并且只执行以下单个操作。我的api应该照顾好一切。
简短的问题是如何。
我在我的mvc应用程序中创建了一个动作来调用api应用程序中的/ token端点。
public class BearerToken
{
[JsonProperty("access_token")]
public string AccessToken { get; set; }
[JsonProperty("token_type")]
public string TokenType { get; set; }
[JsonProperty("userName")]
public string UserName { get; set; }
[JsonProperty(".issued")]
public DateTime Issued { get; set; }
[JsonProperty(".expires")]
public DateTime Expires { get; set; }
}
public async Task<ActionResult> Login(LoginModel model, string returnUrl)
{
if (ModelState.IsValid)
{
var parameters = new Dictionary<string, string>
{
{"grant_type", "password"},
{"username", login.UserName},
{"password", login.Password}
};
var data = RestSharperHelper.PostForm(parameters, "http://localhost:2000/Token");
var bearer = JsonConvert.DeserializeObject<BearerToken>(data);
if (bearer != null)
{
//user access_token for all future api requests
//how do I generate the local auth cookie to tell the application User.Authenticated = true?
}
在调用/ Token端点后,如何设置本地身份验证cookie以允许webapp使用我的控制器上的[Authorize]属性?
提前谢谢。
答案 0 :(得分:0)
从web api获得持有者令牌后,您可以执行以下操作
//解密令牌(这需要在web api和wep app所在的服务器上使用相同的机器密钥)
var unencryptedToken = Startup.OAuthBearerOptions.AccessTokenFormat.Unprotect(accessToken);
//从令牌中提取声明标识
var identity = unencryptedToken.Identity;
//为应用程序cookie创建声明标识(这是Web应用程序将使用的标识)
var id = new ClaimsIdentity(identity.Claims, DefaultAuthenticationTypes.ApplicationCookie);
//使用OWIN AuthenticationManager使用新的声明标识登录Web应用程序。这将创建应用程序cookie并在HttpContext上正确填充User.IsAuthenticated()和ClaimsIdentity,之后基于属性的身份验证将起作用
AuthenticationManager.SignIn(id);
注意:我无法从原始问题中了解您需要遵守的oauth规范,或者您的网络应用是面向互联网还是企业。可以声称,如果这是100%oauth实现(或者为什么给Web应用程序更改解密并可能修改令牌中的声明),则Web应用程序不应该能够解密令牌。我的回答是,这完全取决于您的应用程序和安全需求。如果您需要在Web应用程序中以某种方式使用持票人令牌,则必须解密令牌并提取声明。只要您的网络应用不尝试附加声明并重新加密,我就不会发现这样做有问题。此外,您还可以在有效负载中包含额外的字段,只有web api可以读取,其中包括创建时令牌的哈希值。这是一种抗回火机制。如果令牌中的声明发生更改,则散列签名将不同。
另一个注意事项:您需要将此逻辑与承载令牌到期逻辑同步。每次续订持票人令牌时,您也将重复上述程序。 (刷新Web应用程序中的声明标识)但是这些代码很少,而且很有效。