在我的应用程序的Asp.Net Identity Auth中间件设置中

app.UseCookieAuthentication(new CookieAuthenticationOptions {
    LoginPath = new PathString("/Login/"),
    //AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    Provider = new CookieAuthenticationProvider {
    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<MyUserManager, MyUser>(
                        TimeSpan.FromMinutes(30),
                        (manager, user) => manager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie)
                    ),
    },
});


我已经从另一个应用程序复制了此文件,但我刚刚注意到,如果取消注释AuthenticationType行,则登录成功(我从控制器写的记录器中收到一条成功消息),但始终重定向回登录屏幕。

documentation for CookieAuthenticationOptions中说


选项中的AuthenticationType对应于IIdentity AuthenticationType属性。为了在管道中多次使用相同的身份验证中间件类型,可以分配一个不同的值。(继承自AuthenticationOptions。)


我真的不明白这是什么意思,为什么这会导致我的登录请求被重定向(至少成功登录之后),或者这个选项有什么用处。

最佳答案

这是一个字符串,可以是任何东西。但这是身份验证类型的标识符。而且,您可以有多种身份验证类型:您的数据库以及用户,Google,Facebook等。据我所知,这是作为登录时生成的Cookie的声明添加的。

注销用户时,您需要了解身份验证提供程序。如果您的身份验证中间件是这样定义的:

    app.UseCookieAuthentication(new CookieAuthenticationOptions {
        LoginPath = new PathString("/Login/"),
        AuthenticationType = "My-Magical-Authentication",
        // etc...
        },
    });


然后要注销用户,您需要相同的魔术字符串:AuthenticationManager.SignOut("My-Magical-Authentication")

创建主体时,此字符串也将传递到ClaimsIdentity中。如果没有AuthenticationType主体,则无法通过because进行身份验证:

/// <summary>
/// Gets a value that indicates whether the identity has been authenticated.
/// </summary>
///
/// <returns>
/// true if the identity has been authenticated; otherwise, false.
/// </returns>
public virtual bool IsAuthenticated
{
  get
  {
    return !string.IsNullOrEmpty(this.m_authenticationType);
  }
}


在整个MVC代码库中都使用此方法IsAuthenticated,所有身份验证机制都依赖于此方法。

从理论上讲,您也可以通过多个提供商进行登录,并且一次只能注销其中一个提供商,而其余提供商仍需进行身份验证。虽然我从未尝试过。

我刚刚发现的另一种用途-如果您未在中间件配置中提供CookieName,则为Options.CookieName = CookieAuthenticationDefaults.CookiePrefix + Options.AuthenticationType;see second if statement in constructor)。

我敢肯定还有更多使用它的地方。但是最重​​要的是提供它并与名称保持一致,否则您将在身份验证系统中遇到细微的错误。

09-05 20:23