从web api生成auth cookie,以便在Web应用程序中使用

时间:2014-03-02 05:14:04

标签: asp.net-web-api owin asp.net-mvc-5.1

我设法让一个承载令牌在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]属性?

提前谢谢。

1 个答案:

答案 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应用程序中的声明标识)但是这些代码很少,而且很有效。