使用Microsoft.Owin.Security.OpenIdConnect以编程方式重定向未授权用户

时间:2017-08-25 17:27:19

标签: asp.net-mvc url-routing openid-connect owin-middleware

当我第一次开始开发我的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方法将中间件调用为行动。

0 个答案:

没有答案