当我第一次开始开发我的MVC应用程序(需要授权,有选择地渲染SPA,而后者又通过ADAL.js进行自己的授权)时,我简单地用[Authorize]
装饰了HomeController的Index方法,就像这样,
[Authorize]
public ActionResult Index(bool ok = false)
{
return View();
}
一切正常。
但是,有时我希望用户相互共享网址。我的SPA使用基于散列的路由来呈现各种状态。只要两个用户都已登录,他们就可以相互分享链接,所有内容都可以正常工作。
但是,如果用户点击链接尚未登录,我们将丢失在URL中传达的状态..哈希之后的所有内容...例如如果用户A向未经身份验证的用户B发送此URL:http://mycorp.com/#/orders/85/edit
HomeController
将注意到用户B未经身份验证,并且中间件将用户B踢到我们的Microsoft登录页面。他重定向回来,网址的关键#/orders/85/edit
部分已经消失。
我的解决方案是从[Authorize]
操作中移除Index
属性,而是执行以下操作:
public ActionResult Index(bool ok=false)
{
if (!User.Identity.IsAuthenticated)
{
if (!ok)
return View("SetCookie_Then_RedirectWith_OK_InQueryString");
if (ok)
//how do I do this part?
return new RedirectResult(Microsoft.Owin.Security.OpenIdConnect.Url);
}
else
//now we're authenticated,
//let JS resume by looking for cookie set previously
return View("Index");
}
请注意上面的how do I do this part
评论。那是我的问题。
++++++++++++++++++++++++++++++++++++++++++++++++++
我的应用程序提供了一个Startup.Auth.cs
文件,其中声明了熟悉的中间件......
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
...blah...
}
);
我认为我可以做something fancy here in Startup.Auth.cs w/Notification Handlers但是,我希望直接用Index
方法将中间件调用为行动。