我正在开发一个项目来构建一个抓取我们内部网页的网络蜘蛛。使用Identity Framework构建安全性。使用此代码可以轻松完成未受保护的页面:
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("http://www.yoursite.com/resource/file.htm");
using (StreamWriter streamWriter = new StreamWriter(webRequest.GetRequestStream(), Encoding.UTF8))
{
streamWriter.Write(requestData);
}
string responseData = string.Empty;
HttpWebResponse httpResponse = (HttpWebResponse)webRequest.GetResponse();
using (StreamReader responseReader = new StreamReader(httpResponse.GetResponseStream()))
{
responseData = responseReader.ReadToEnd();
}
但是这段代码并没有使用OWIN身份验证,因此当它访问受保护的页面时,它无法访问它。
如果我已登录并尝试HttpContext.Request,那么我会通过调试器看到Request已经过身份验证。如何使用此请求对象获取要解析的新受保护页面?我确信,我错过了一种非常简单的方法。
更新 我仍在努力解决这个问题。也许我应该问另一种方式。我正在从同一个Web应用程序调用一个页面。从调用控制器返回true,这是好的:
HttpContext.Current.User.Identity.IsAuthenticated
但是通过调试器并在接收控制器中检查它,现在这是错误的,这很糟糕:
HttpContext.Current.User.Identity.IsAuthenticated
如何让接收控制器进行身份验证?
答案 0 :(得分:0)
这实际上取决于您在服务器端使用的实现身份验证方法。 Asp.net Identity本质上是一个会员系统。
例如,如果它正在使用承载认证令牌,那么您需要在要发送的请求的Authorization标头中设置承载认证令牌。我宁愿建议将HttpClient
用于这些目的。
正如你提到的OWIN,我假设这是一个不记名的令牌场景。
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "Your Oauth token");
如果您以后使用Asp.net MVC的默认项目模板和Asp.net Identity作为附加依赖项,您可以在此处连接如下所示的httpClient:
class Program
{
static void Main()
{
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://yourapp");
var content = new FormUrlEncodedContent(new[]
{
// Push your stuff here, your username, password fields
// as you coded in your server
new KeyValuePair<string, string>("", "login")
});
var result = client.PostAsync("login", content).Result;
string resultContent = result.Content.ReadAsStringAsync().Result;
Console.WriteLine(resultContent);
}
}
}
你当然需要保存身份验证cookie,你可以看到如何here并在你获取安全页面的请求时附加它,你必须做{{3}之类的事情}
答案 1 :(得分:0)
看起来权限基于角色。在用户被重定向到该页面时,检查您登录的用户是否具有访问控制器方法的权限。
如果您具有指定用户所需角色的方法的属性参数,则登录用户应具有访问该页面的权限。
正在进行身份验证可能是授权问题。用户可能没有足够的权限来访问该页面。