1

我已经设法让不记名令牌在 api 项目中工作。

在我的解决方案中,我有 2 个项目一个 api 和 mvc 应用程序。api 处理承载令牌的身份验证和生成。

我想从 mvc 应用程序调用 api 进行身份验证并能够设置身份验证 cookie 以与 mvc 应用程序一起使用。

我的 Web 应用程序没有标准的帐户控制器操作。我已删除所有操作,并且只有一个操作,如下所示。我的 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] 属性?

先感谢您。

4

1 回答 1

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 可以读取,其中包括创建令牌时的哈希值。这用作抗回火机制。

另一个注意事项:您需要将此逻辑与不记名令牌到期逻辑同步。每次更新不记名令牌时,您还将重复上述过程。(刷新网络应用程序中的声明标识)但它是几行额外的代码,它的工作原理。

于 2014-12-16T14:37:15.467 回答