远程服务器上的基本身份验证
Basic authentication on a remote server
我需要一些有关 ASMX 网络服务的帮助。
假设我有一个 ServerService 提供一些数据。假设它有一个 GetRandomInteger 方法,其中 returns 一个随机整数(显然)。它使用 IHttpModule 实现自定义基本身份验证。
public class BasicAuthHttpModule : IHttpModule
{
private UserRepository _userRepository;
public void Dispose()
{
}
public void Init(HttpApplication application)
{
_userRepository = new UserRepository();
application.AuthenticateRequest += OnAuthenticateRequest;
application.EndRequest += OnEndRequest;
}
public void OnAuthenticateRequest(object source, EventArgs e)
{
var app = (HttpApplication)source;
string authHeader = app.Request.Headers["Authorization"];
if (!string.IsNullOrEmpty(authHeader))
{
// Here I successfully get credentials from header
if (_userRepository.ValidateUser(username, password)) return;
// Return 401 and CompleteRequest
}
else
{
// Return 401 and End
}
}
public void OnEndRequest(object source, EventArgs eventArgs)
{
if (HttpContext.Current.Response.StatusCode == 401)
{
// Return 401 and require new authorization
}
}
幸运的是,它有效。现在我可以成功打开 Service.asmx 文件,获得基本身份验证 window 并在成功身份验证后访问它的 GetRandomInteger 方法。
现在我有一个名为 ClientService 的 ASP.NET MVC 4 应用程序。它必须为用户界面提供对 ServerService 方法的方便和适当的访问。现在它有默认控制器,如帐户和主页、默认视图等。
我需要此 ClientService 在 ServerService 上进行身份验证。我的意思是会有一个带有按钮 "Login" 的 Home/Index 页面。我在那里输入登录名和密码,ClientService 尝试在 ServerService 上进行身份验证。它 returns 失败时出错或成功时提供对某些 Home/RandomInt 页面的访问权限,该页面将显示从 ServerService 请求的整数。最好和最简单的方法是什么?
如何在ServerService上实现注册? ASMX 中没有 AllowAnonymous 属性或其他属性,因此我无法注册用户,因为他因 401 错误无法访问任何方法。
提前致谢。
P.S。不,我不能使用 WCF 或其他东西。我需要实施 ASMX 网络服务。
更新 1: 好的,我从这里学到了一些新东西
有一个像 "Web reference" 这样的老式东西,它不是 "Service reference"。我已将这个 Web 引用添加到我的项目中,现在我可以通过这种方式从这个 ASMX 页面调用一些方法:
try
{
ServerService svc = new ServerService();
svc.Credentials = new NetworkCredential("user", "password");
int a = svc.GetRandomInteger();
} catch (WebException e) {
// Auth failed
}
但是,我不明白如何 link 它与 ASP.NET MVC ClientService 身份验证。所以,这两个问题仍然悬而未决。希望我能理解,否则你会帮助我。
这是一个文档,用于添加对 ASMX 服务的 Web 引用。
使用这些信息,我可以轻松地向 Web 服务发出请求。
我在问题更新时唯一要做的就是创建自定义身份验证。
当用户登录时,客户端向服务发送请求。如果基本身份验证成功,它会为用户创建适当的 FormsAuthentication cookie 票证。用户登录。
在对服务的每个请求中,客户端从 FormsAuthentication cookie 中提取登录名,并从服务器缓存中提取他的密码,并使用它们对服务进行身份验证。在基本身份验证失败的情况下(只有在服务端更改了用户密码时才会发生)cookie 被清除并且会话被中止。
使用另一个不使用基本身份验证但匿名的 ASMX 服务实现注册(因为注册应该是匿名方法)。
就是这样。最后,我找到了一个合适的解决方案:)
我需要一些有关 ASMX 网络服务的帮助。
假设我有一个 ServerService 提供一些数据。假设它有一个 GetRandomInteger 方法,其中 returns 一个随机整数(显然)。它使用 IHttpModule 实现自定义基本身份验证。
public class BasicAuthHttpModule : IHttpModule
{
private UserRepository _userRepository;
public void Dispose()
{
}
public void Init(HttpApplication application)
{
_userRepository = new UserRepository();
application.AuthenticateRequest += OnAuthenticateRequest;
application.EndRequest += OnEndRequest;
}
public void OnAuthenticateRequest(object source, EventArgs e)
{
var app = (HttpApplication)source;
string authHeader = app.Request.Headers["Authorization"];
if (!string.IsNullOrEmpty(authHeader))
{
// Here I successfully get credentials from header
if (_userRepository.ValidateUser(username, password)) return;
// Return 401 and CompleteRequest
}
else
{
// Return 401 and End
}
}
public void OnEndRequest(object source, EventArgs eventArgs)
{
if (HttpContext.Current.Response.StatusCode == 401)
{
// Return 401 and require new authorization
}
}
幸运的是,它有效。现在我可以成功打开 Service.asmx 文件,获得基本身份验证 window 并在成功身份验证后访问它的 GetRandomInteger 方法。
现在我有一个名为 ClientService 的 ASP.NET MVC 4 应用程序。它必须为用户界面提供对 ServerService 方法的方便和适当的访问。现在它有默认控制器,如帐户和主页、默认视图等。
我需要此 ClientService 在 ServerService 上进行身份验证。我的意思是会有一个带有按钮 "Login" 的 Home/Index 页面。我在那里输入登录名和密码,ClientService 尝试在 ServerService 上进行身份验证。它 returns 失败时出错或成功时提供对某些 Home/RandomInt 页面的访问权限,该页面将显示从 ServerService 请求的整数。最好和最简单的方法是什么?
如何在ServerService上实现注册? ASMX 中没有 AllowAnonymous 属性或其他属性,因此我无法注册用户,因为他因 401 错误无法访问任何方法。
提前致谢。
P.S。不,我不能使用 WCF 或其他东西。我需要实施 ASMX 网络服务。
更新 1: 好的,我从这里学到了一些新东西
有一个像 "Web reference" 这样的老式东西,它不是 "Service reference"。我已将这个 Web 引用添加到我的项目中,现在我可以通过这种方式从这个 ASMX 页面调用一些方法:
try
{
ServerService svc = new ServerService();
svc.Credentials = new NetworkCredential("user", "password");
int a = svc.GetRandomInteger();
} catch (WebException e) {
// Auth failed
}
但是,我不明白如何 link 它与 ASP.NET MVC ClientService 身份验证。所以,这两个问题仍然悬而未决。希望我能理解,否则你会帮助我。
这是一个文档,用于添加对 ASMX 服务的 Web 引用。
使用这些信息,我可以轻松地向 Web 服务发出请求。
我在问题更新时唯一要做的就是创建自定义身份验证。
当用户登录时,客户端向服务发送请求。如果基本身份验证成功,它会为用户创建适当的 FormsAuthentication cookie 票证。用户登录。
在对服务的每个请求中,客户端从 FormsAuthentication cookie 中提取登录名,并从服务器缓存中提取他的密码,并使用它们对服务进行身份验证。在基本身份验证失败的情况下(只有在服务端更改了用户密码时才会发生)cookie 被清除并且会话被中止。
使用另一个不使用基本身份验证但匿名的 ASMX 服务实现注册(因为注册应该是匿名方法)。
就是这样。最后,我找到了一个合适的解决方案:)