2016-07-26 98 views
0

我目前有一个我的应用程序的问题。刷新从YouTube的Office365授权令牌

问题是,用户可以在输入任何数据前长时间保持页面打开,所以偶尔当他们输入数据并点击提交按钮时,他们被重定向到o365进行身份验证,因此会丢失输入数据。

我有适用于应用程序的所有标准身份验证。然而,我相信为了做到这一点,我需要在点击提交按钮时在javascript中获得刷新令牌,并将此令牌发送给api方法以授予访问权限。

这是可能的,是否有人知道如何去做?

这是一个MVC ASP.NET应用程序,使用微软Azure AD的Owin O365安全性。

我不确定哪些信息或代码片段在这里是相关的,所以如果有什么我可以提供的,请询问。

我发现有多个获取令牌等与角度的例子,但是,这不是一个SPA和不使用角。

很多预先感谢。

UPDATE

我试图检索使用下面的代码使用ADAL JS令牌,但它似乎没有认识到AuthorizationContext(配置)电话:

<script src="https://secure.aadcdn.microsoftonline-p.com/lib/1.0.0/js/adal.min.js"></script> 

    $('#btnSubmit').on('click', function (e) { 
     e.preventDefault(); 
     CheckUserAuthorised(); 
    }); 

    function CheckUserAuthorised() { 
     window.config = { 
      instance: 'https://login.microsoftonline.com/', 
      tenant: '##################', 
      clientId: '###################', 
      postLogoutRedirectUri: window.location.origin, 
      cacheLocation: 'localStorage' 
     }; 
     var authContext = new AuthorizationContext(config); //THIS LINE FAILS 
     var user = authContext.getCachedUser(); 
     if (!user) { 
      alert("User Not Authorised"); 
      authContext.login(); 
     } 
     else { 
      alert('User Authorized'); 
     } 
    } 

这提供了以下错误在控制台:

'AuthorizationContext' is undefined

UPDATE

我没有通过未定义的错误。这是因为我打电话给AuthorizationContext而不是AuthenticationContext。小学生错误。但是现在,无论何时我检查上下文的用户属性,它始终为空。我不知道解决这个问题的方法是在页面加载时初始化上下文。

+0

您的代码中存在拼写错误。尝试将AuthorisationContext更改为AuthorizationContext。 – n0m4d

+0

好点,谢谢你,但我仍然得到错误:'AuthorizationContext是未定义的' – DaRoGa

+0

你从哪里得到这个代码示例?另一件事:不要传递给AuthorizationContext这个配置,而是将其作为window.config传递,因为配置是在窗口对象中定义的。 – n0m4d

回答

0

目前缺乏在你的代码中的一步,这里是一个简单的代码示例,希望它会帮助你:

<script src="https://secure.aadcdn.microsoftonline-p.com/lib/1.0.10/js/adal.min.js"></script> 

<body> 
<a href="#" onclick="login();">login</a> 
<a href="#" onclick="getToken()">access token</a> 
<a href="#" onclick="getUser()">get user</a> 
</body> 
<script type="text/javascript"> 
    var configOptions = { 
     tenant: "<tenant_id>", // Optional by default, it sends common 
     clientId: "<client_id>", 
     postLogoutRedirectUri: window.location.origin, 
    } 
    window.authContext = new AuthenticationContext(configOptions); 

    var isCallback = authContext.isCallback(window.location.hash); 
    authContext.handleWindowCallback(); 

    function getToken(){ 
     authContext.acquireToken("https://graph.microsoft.com",function(error, token){ 
      console.log(error); 
      console.log(token); 
     }) 
    } 
    function login(){ 
     authContext.login(); 
    } 
    function getUser(){ 
     var user = authContext.getCachedUser(); 
     console.log(user); 
    } 
</script> 

的代码示例是从No 'Access-Control-Allow-Origin' header with Microsoft Online Auth答案。问题是不同的,但他们是在相同的情况。

任何进一步的关注,请随时让我知道。

+0

非常感谢,我现在就试试。关于IE的问题,是否也适用于Edge,并且仅限于本地主机,因此部署时不需要考虑哪个浏览器?作为我的大部分用户,使用IE还是Edge?再次感谢 – DaRoGa

+0

,有没有一种方法可以在不将浏览器重定向到微软的情况下获取令牌/登录?基本上我正在尝试这样做,以便我不会丢失输入到页面上的数据,并且我可以获取令牌,并将其作为参数传递给API方法。谢谢, – DaRoGa

+0

对不起,如果我在这里很幼稚,但我不明白它是如何工作的,当你第一次加载页面时,authContext被初始化,此时用户将为空,因此在获取令牌之前需要登录。登录它重定向到microsoftonline登录并重定向回原始页面authContext重新初始化和用户将再次为null?或者我错过了什么? – DaRoGa

0

我在网上发现了一个类似的example,您的问题似乎与您正在实例化的对象有关。

而不是

new AuthorizationContext(window.config); 

尝试

new AuthenticationContext(window.config); 

代码跑就好示出用户未通过身份验证。

+0

嗨是的,我也发现了这一点,我不再收到未定义的错误,但是,现在用户是总是为空,我传递参数,如果(!用户){authContext.login()}等,但因为实例化总是在页面加载完成,用户始终为空。我怎样才能解决这个问题? – DaRoGa

+0

当你将参数传递给url并尝试在浏览器上运行时,你会得到任何回应吗? – n0m4d

+0

当我调用.login()时,浏览器重定向并返回格式为“https:// localhost:44300 /通信/添加#id_token = ey ............”的url中的id_token。 。&session_state = .....' – DaRoGa