【发布时间】:2015-02-03 06:09:04
【问题描述】:
我有一个非常薄的前端 ASP.NET MVC 5 应用程序,它与 WebApi 2 后端通信。这些是单独的应用程序。
我已从 WebApi 获得身份验证令牌。我必须在用户登录时获取它。我将它存储在会话状态中,但这显然是错误的地方。我遇到用户仍然登录但身份验证令牌不再处于会话中的情况。
我需要将它与我的身份验证 cookie 一起存储,并且它需要具有相同的生命周期。为什么没有开箱即用的方法呢?我敢肯定,这是成千上万的程序员面临的情况。
这是我将其存储到 Session 中的代码:
/// <summary>
/// Configure the application sign-in manager which is used in this application.
/// </summary>
public class ApplicationSignInManager : SignInManager<ApplicationUser, string>
{
public override async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
{
var status = await base.PasswordSignInAsync(userName, password, isPersistent, shouldLockout);
if (status == SignInStatus.Success)
await PasswordSaveTokenAsync(userName, password);
return status;
}
/// <summary>
/// Get the token from the Web API with the given user name (<paramref name="userName"/>) and password
/// (<paramref name="password"/>) and save it to the session state.
/// </summary>
/// <param name="userName">User name.</param>
/// <param name="password">Password.</param>
private async Task PasswordSaveTokenAsync(string userName, string password)
{
var baseAddress = Config.WebApiAddress;
var client = new HttpClient { BaseAddress = baseAddress };
var response = await client.PostAsync("Token", new StringContent(String.Format("grant_type=password&username={0}&password={1}", userName, password), Encoding.UTF8));
response.EnsureSuccessStatusCode();
var tokenResponse = await response.Content.ReadAsStringAsync();
var json = JObject.Parse(tokenResponse);
var token = json["access_token"].ToString();
Session.AccessToken = token;
}
}
【问题讨论】:
标签: asp.net-mvc asp.net-web-api