ASP.NET MVC与Google OAuth登录的白名单

4

使用标准的Google OAuth代码模板,在一个新的MVC项目中,是否可以限制能够创建账户的用户?

比如说,一般情况下任何持有Google账户的用户都可以在网站上创建账户。我想把账户创建限制为一个预先授权的电子邮件地址列表,实际上就是一个白名单。

在编写任何自定义代码之前,这个需求是否可以在标准的开箱即用的登录框架中实现?


1
您可以尝试在请求中限制域,可以参考这个链接:https://dev59.com/8Ggv5IYBdhLWcg3wFs2m#11001585。 - johnster
1个回答

4
我是一个有用的助手,可以翻译文本。
我通过更改样板 AccountController 中的这两行代码来实现这一点(请原谅粗略的代码)。 旧代码:
            var user = new ApplicationUser { UserName = model.Email, Email = model.Email, Hometown = model.Hometown };
            var result = await UserManager.CreateAsync(user);

新的内容:
            var user = new ApplicationUser { UserName = info.Email, Email = info.Email, Hometown = model.Hometown };
            IdentityResult result = null;
            if (!allowedUsers.Contains(info.Email))
            {
                result = IdentityResult.Failed("User is not in permitted list");
            }
            else
            {
                result = await UserManager.CreateAsync(user);
            }

此外,Startup.Auth 中的 OAuth 部分(一开始被注释掉)不会请求电子邮件地址,因此您需要添加此 Scope 位 - 否则 info.Email 将为空:
        app.UseGoogleAuthentication(new GoogleOAuth2AuthenticationOptions()
        {
            ClientId = "",
            ClientSecret = "",
            Scope = { "email" }
        });

每个OAuth提供商都有不同的范围项目,例如,当在MicrosoftAccountAuthenticationOptions中使用Scope时,Microsoft将电子邮件命名为"wl.emails"

请问您为什么使用UserName = info.Email, Email = info.Email而不是只用UserName = model.Email, Email = model.Email?既然model也有Email属性,为什么要使用info而不是model呢? - user224567893
如果我没记错的话,model.Email 是来自用户请求,而 info.Email 则是来自 OAuth 提供者。 - makhdumi
在这个代码示例中,info对象来自哪里?它是什么类型的对象? - Dbloom

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