我一直在努力解决这个问题,但是有很多问题,不幸的是,所有正式文档和教程都是基于带有单独用户帐户的Visual Studio模板。
我相信我的目标非常简单。我有一个Web应用程序,它将仅支持外部提供程序登录(即:Facebook,Twitter和LinkedIn)。我不想支持cookie身份验证,因为将不支持自定义用户名/密码。
我的第一个问题是定义默认的AuthenticationScheme。以下是我的startup.cs:
services.AddAuthentication()
.AddFacebook(/* options */)
.AddTwitter(/* options */)
如果我使用Authorize属性定义一个控制器动作,那么当我点击该路由时,不会得到默认的身份验证方案定义错误。但是,如果用户未经授权,我希望将他们重定向到我的登录路由。如果我像下面那样修改startup.cs,那么所有方法都可以,但是我认为我支持我不想的cookie(旧形式身份验证?)身份验证。
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie()
.AddFacebook(/* options */)
我的另一个问题是我不知道在AddFacebook()调用下会发生什么。如果以这种方式设置中间件并使用Facebook登录,我会神奇地获得所有必要的令牌,声明,然后突然我设置了一个应用程序cookie,并且我的fb_login回调路由可以访问Facebook的令牌!当我检查网络请求时,我看到signin-facebook路由被击中-我没有定义-并且我猜它在幕后调用HttpContext.SignInAsync()等...但是如果我刷新我的fb-登录回调并检查是否
HttpContext.AuthenticateAsync(FacebookDefaults.AuthenticationScheme)
返回成功=真否!它返回假!但这是一秒钟前的事吗?
此外,什么时候应该使用AuthenticateAsync()和SignInAsync()之类的方法?
长话短说,我需要一个教程或文档来解释此中间件而无需 asp.net身份框架,EntityFramework和模板。
我想了解一个简单的AddFacebook()调用如何绑定所有内容,并且如果我想手动执行此操作(例如使用AddOauth),我该如何实现相同的功能?
我不喜欢“自动工作”的代码,因此,如果有人可以解释这里发生的事情,我将非常感激。
答案 0 :(得分:1)
Cookie auth用于在请求之间保留身份验证状态。没有替代品,没有,它与表单身份验证不同,尽管在两种情况下都使用cookie。这样做的原因仅仅是因为cookie是使状态通过HTTP协议工作的原因,HTTP协议本身是无状态的。如果不使用cookie,则没有其他机制可以保持状态。
使用类似Facebook auth方案的方法直接授权初始请求,但是同样,由于没有状态,因此无需再次通过Facebook OAuth流程就不再对下一个请求进行身份验证。
总之,对于API之类的东西,还有其他身份验证方案,其中通常通过Authorization
头之类的东西分别对每个请求进行身份验证。 Web浏览器无法以这种方式工作,而是依靠Cookie来处理后续授权。没有Cookie,没有身份验证。