ASP.NET OWIN 中用于外部登录的外部 Cookie

7
我们有一个基于ASP.NET Mvc 4构建的遗留系统,现在我们希望为现有用户和新用户支持通过Azure Active Directory进行Signal Sign On。由于我们已经管理了自己的身份验证工作流程,因此ASP.NET Identity显然不适用于我们的情况。
我已经成功构建了一个演示,它使用OWIN OpenIdConnect中间件被动模式,在不使用ASP.NET Identity的情况下正常工作。以下代码是正确的:
app.SetDefaultSignInAsAuthenticationType("ExternalCookie");
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = "ExternalCookie",
    AuthenticationMode = AuthenticationMode.Passive,
});

app.UseOpenIdConnectAuthentication(
    new OpenIdConnectAuthenticationOptions
    {
        AuthenticationMode = AuthenticationMode.Passive,
        ClientId = ClientId,
        Authority = Authority

        // More code
    });

ExternalLoginCallback操作中:
public async Task<ActionResult> ExternalLoginCallback(string returnUrl)
{
    var authManager = Request.GetOwinContext().Authentication;

    var result = await authManager.AuthenticateAsync("ExternalCookie");
    authManager.SignOut("ExternalCookie");

    //More code to convert to local identity
}

即使使用像Google、Facebook或Twitter这样的其他提供商,这种情况也非常普遍。我不太清楚的一件事是ExternalCookie,也许我错过了整个事情。我的理解是,在外部登录成功后,外部cookie用于存储外部声明的身份。然后我们调用:

var result = await authManager.AuthenticateAsync("ExternalCookie");
authManager.SignOut("ExternalCookie");

为了获取外部声明身份,然后将外部身份转换为本地身份。我有一点困惑,为什么在这种情况下我们必须调用SignOut外部cookie。
另外,我不确定在使用外部登录时是否必须使用外部cookie,或者我们是否有其他方法可以避免使用外部cookie。
请有人对这个问题进行解释。

1
关于您的第一个问题,即SignOut,它是清理工作。请参见此SO问题。关于您的第三个问题,即“ExternalCookie”名称,我非常确定这只是为了让您的身份验证代码引用相同的cookie。如果您将代码中所有字符串文字“ExternalCookie”替换为“BlergyBlergy”,功能仍将正常工作。在Web生命周期期间直接检查浏览器cookie以说明。 - Chris Simmons
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Chris Simmons
@ChrisSimmons:感谢提供链接,我也发现这个答案https://dev59.com/y18e5IYBdhLWcg3wCGu_ 解释得非常清楚。 - cuongle
1个回答

1
为了回答你的最后一个问题,你需要在配置外部cookie的startup.auth文件中更改cookie的名称。
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

你可以使用字符串代替DefaultAuthenticationTypes枚举,并直接指定cookie的名称,例如:
app.UseExternalSignInCookie("myExternalCookie");

在您的情况下,您已经在使用字符串,所以您只需要指定一个不同的名称即可。 - naveenraina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接