我有一个Web API(我所有的代码)方法,我希望在Azure中按计划调用它。我把这一切都搞定了。我可以指定URL,设置一个计划,它工作正常。我想做的是限制对某个“系统”用户的调用。
从网站调用所有其他Web API方法。该网站允许用户登录并接收“访问令牌”,然后该令牌与所有其他请求一起发送。所以这是一个两步过程。这一切都很好。
如何从Azure计划程序中将“系统”用户/密码传递给Web API方法?它看起来非常简单,选择基本身份验证,然后输入用户/密码组合。它仍然调用Web API方法,但它没有经过身份验证?在调用Web API方法之前,我不确定如何让用户通过身份验证?
答案 0 :(得分:1)
您可能使用Azure Active Directory等身份提供程序。您应该使用服务主体来表示您的计划应用程序,该应用程序允许调用您的API而不是用户主体(您的系统用户)。
了解更多: Application and service principal objects in Azure Active Directory (Azure AD)
因此,在身份验证设置中,您应选择Active Directory OAuth并提供必要的值:
必须在WebAPI中配置基本身份验证,它与您正在使用的令牌身份验证无关。
答案 1 :(得分:0)
它仍调用Web API方法,但未经过身份验证?
在调用Web API方法之前,我不确定如何让用户通过身份验证?
根据您的描述,您似乎希望在Web API中使用基本身份验证。就像您的猜测一样,我们可以使用Basic Authentication直接输入用户名和密码。我创建了一个简单的演示,如果我想在Web API中读取数据,我需要先进行身份验证。你可以参考我的代码:
Web API项目中的代码
创建BasicAuthHttpModule.cs :(具体为您的用户名和密码)
public class BasicAuthHttpModule : IHttpModule
{
private const string Realm = "My Realm";
public void Init(HttpApplication context)
{
// Register event handlers
context.AuthenticateRequest += OnApplicationAuthenticateRequest;
context.EndRequest += OnApplicationEndRequest;
}
private static void SetPrincipal(IPrincipal principal)
{
Thread.CurrentPrincipal = principal;
if (HttpContext.Current != null)
{
HttpContext.Current.User = principal;
}
}
// TODO: Here is where you would validate the username and password.
private static bool CheckPassword(string username, string password)
{
return username == "peter" && password == "Password123!"; // you also could read user name and password from your Azure SQL database
}
private static void AuthenticateUser(string credentials)
{
try
{
var encoding = Encoding.GetEncoding("iso-8859-1");
credentials = encoding.GetString(Convert.FromBase64String(credentials));
int separator = credentials.IndexOf(':');
string name = credentials.Substring(0, separator);
string password = credentials.Substring(separator + 1);
if (CheckPassword(name, password))
{
var identity = new GenericIdentity(name);
SetPrincipal(new GenericPrincipal(identity, null));
}
else
{
// Invalid username or password.
HttpContext.Current.Response.StatusCode = 401;
}
}
catch (FormatException)
{
// Credentials were not formatted correctly.
HttpContext.Current.Response.StatusCode = 401;
}
}
private static void OnApplicationAuthenticateRequest(object sender, EventArgs e)
{
var request = HttpContext.Current.Request;
var authHeader = request.Headers["Authorization"];
if (authHeader != null)
{
var authHeaderVal = AuthenticationHeaderValue.Parse(authHeader);
// RFC 2617 sec 1.2, "scheme" name is case-insensitive
if (authHeaderVal.Scheme.Equals("basic",
StringComparison.OrdinalIgnoreCase) &&
authHeaderVal.Parameter != null)
{
AuthenticateUser(authHeaderVal.Parameter);
}
}
}
// If the request was unauthorized, add the WWW-Authenticate header
// to the response.
private static void OnApplicationEndRequest(object sender, EventArgs e)
{
var response = HttpContext.Current.Response;
if (response.StatusCode == 401)
{
response.Headers.Add("WWW-Authenticate",
string.Format("Basic realm=\"{0}\"", Realm));
}
}
public void Dispose()
{
}
}
web.config中的代码:
<modules>
<add name="BasicAuthHttpModule"
type=" [your project name].[folder name].BasicAuthHttpModule, [your project name]"/>
<!--Just like this: WebApiAzure1.BasicAuthor.BasicAuthHttpModule,WebApiAzure1-->
</modules>
Api控制器中的代码:
[Authorize] //add authorize attribute for specific method
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
您可以看到如下结果: