我正在使用 ASP.NET Identity,它在本地通过常规登录和外部登录完美运行。出于某种原因,当我发布我的项目并在远程服务器上运行它时,我的授权会话大约有 1 分钟。1分钟后,我被重定向到我的登录页面。(无错误消息)
我的启动身份验证配置:
public partial class Startup
{
public void ConfigureAuth(IAppBuilder app)
{
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Account/Login"),
ExpireTimeSpan = TimeSpan.FromDays(2),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, VisU>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
}
});
var googleOptions = new GoogleOAuth2AuthenticationOptions()
{
ClientId = "***",
ClientSecret = "***",
SignInAsAuthenticationType = DefaultAuthenticationTypes.ExternalCookie,
Provider = new GoogleOAuth2AuthenticationProvider()
{
OnAuthenticated = (context) =>
{
context.Identity.AddClaim(new Claim("urn:google:name", context.Identity.FindFirstValue(ClaimTypes.Name)));
context.Identity.AddClaim(new Claim("urn:google:email", context.Identity.FindFirstValue(ClaimTypes.Email)));
context.Identity.AddClaim(new Claim("urn:google:accesstoken", context.AccessToken, ClaimValueTypes.String, "Google"));
return Task.FromResult(0);
}
}
};
app.UseGoogleAuthentication(googleOptions);
}
我的帐户控制者:
[AllowAnonymous]
public ActionResult Login(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<string> Login()
{
var result = await SignInManager.PasswordSignInAsync(Request.Form["emailLogin"], Request.Form["passwordLogin"], true, shouldLockout: true);
switch (result)
{
case SignInStatus.Success:
return ViewBag.ReturnUrl ?? "https://localhost:44300/Account";
case SignInStatus.LockedOut:
return Resources.Multilang.ERRORLockedOut;
case SignInStatus.Failure:
//Mail or password are incorrect
return Resources.Multilang.ERRORInvalidLogin;
default:
return Resources.Multilang.ERRORInvalidLogin;
}
}
这种行为的原因可能是什么?
("https://localhost:44300/"在发布时更改为我的域名。
此问题的最常见原因之一是未在 web.config 中设置MachineKey
元素。MachineKey
用于加密和解密诸如您的授权 cookie 之类的内容。 如果未设置MachineKey
元素,IIS 将为您组成一个MachineKey
。
如果您将应用程序发布到第三方 Web 托管(如 Azure 或 GoDaddy),这将成为一个问题。这些提供程序通常在多个 Web 服务器上具有 Web 应用程序。 由于如果未设置Web服务器,则Web服务器将组成自己的MachineKey
因此托管应用程序的每个Web服务器都将有自己的MachineKey
。 最终结果是 Web 服务器 A 发出并加密授权 cookie。 如果下一个请求转到网络服务器 B,它将无法解密和读取 cookie,因此它假定您未登录。
在 web.config 中设置MachineKey
可确保托管应用程序的每个 Web 服务器都可以毫无问题地加密和解密授权 Cookie。