gpt4 book ai didi

c# - 具有身份验证的 MVC 应用程序中的 Web API 基本验证

转载 作者:行者123 更新时间:2023-11-30 15:25:32 29 4
gpt4 key购买 nike

所以我有一个使用 Identity 进行身份验证的 C# MVC 应用程序。我现在需要通过 Web API 向我的一些客户公开一些内容。我没有构建单独的应用程序、项目、部署...我只是将 API Controller 添加到我现有的项目中。为了让我的客户简单一些,我决定使用 Basic Auth,而不是强制我的客户使用 SSL 连接到我的 API。

我已经按照这个非常有用的教程在我的 API 中实现了 Basic Auth: http://www.piotrwalat.net/basic-http-authentication-in-asp-net-web-api-using-message-handlers/

问题是,他们的指令接管了整个应用程序的 Auth...

我需要我的 MVC 应用程序继续使用它当前正在使用的 Identity Auth 并希望滚动我自己的自定义属性(如 [APIAuthorize]) 这样它就只适用于我的 API Controller

我可能会四处寻找并尝试让它发挥作用,但由于这涉及安全性,我决定寻求一些专业人士的帮助,以了解如何最好地实现它。具体来说,我需要知道 1) 我在我的 Global.asax 中做了什么(如果有的话),因为上面的 URL 建议我这样做:

    protected void Application_Start()
{
GlobalConfiguration.Configuration.MessageHandlers
.Add(new BasicAuthMessageHandler(){
PrincipalProvider = new DummyPrincipalProvider()
});
//...
}

但同样,这将接管整个应用程序的身份验证...2)我需要在我的自定义身份验证属性中做什么才能使所有这些工作无缝进行。

当然,如果有更好的方法来完成所有这些(无需创建单独的应用程序或增加我的客户的实现难度),那么我会洗耳恭听。

最佳答案

我使用过滤器属性来装饰我想向简单例份验证公开的操作。我不记得我是从哪里得到这段代码的(可能是 stackoverflow,我只是没有链接,所以我不能称赞它)

public class BasicHttpAuthorizeAttribute : AuthorizeAttribute
{
protected override bool IsAuthorized(HttpActionContext actionContext)
{
if (Thread.CurrentPrincipal.Identity.Name.Length == 0)
{
// Get the header value
AuthenticationHeaderValue auth = actionContext.Request.Headers.Authorization;
// ensure its schema is correct
if (auth != null && string.Compare(auth.Scheme, "Basic", StringComparison.OrdinalIgnoreCase) == 0)
{
// get the credientials
string credentials = UTF8Encoding.UTF8.GetString(Convert.FromBase64String(auth.Parameter));
int separatorIndex = credentials.IndexOf(':');
if (separatorIndex >= 0)
{
// get user and password
string passedUserName = credentials.Substring(0, separatorIndex);
string passedPassword = credentials.Substring(separatorIndex + 1);
SimpleAES crypto = new SimpleAES();
string userName = crypto.DecryptString(ConfigurationManager.AppSettings.Get(Constants.SIMPLEUSERNAME));
string password = crypto.DecryptString(ConfigurationManager.AppSettings.Get(Constants.SIMPLEUSERPASSWORD));

// validate
if (passedUserName == userName && passedPassword == password)
{
Thread.CurrentPrincipal = actionContext.ControllerContext.RequestContext.Principal = new GenericPrincipal(new GenericIdentity(userName, "Basic"), new string[] { });
}
}
}
}
return base.IsAuthorized(actionContext);
}
}

然后我就这样用了

[BasicHttpAuthorize]
public HttpResponseMessage MyExposedSimpleAuthAction()

关于c# - 具有身份验证的 MVC 应用程序中的 Web API 基本验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30932487/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com