gpt4 book ai didi

asp.net - 使用另一种身份验证方法进行外部 api 调用

转载 作者:行者123 更新时间:2023-12-02 21:14:44 25 4
gpt4 key购买 nike

我有一个带有 MVC 的 Web API 应用程序。当用户使用网站时,身份验证和授权当前由我使用的全局表单例份验证自动处理,在 Web.config 中配置如下:

<authentication mode="Forms">
<forms loginUrl="~/Login" slidingExpiration="true" timeout="1800" defaultUrl="/"></forms>
</authentication>
<authorization>
<deny users="?" />
</authorization>

这可确保只有登录的用户才能访问该网站并调用 API。

但我还有一个外部 Windows 客户端,我想为其使用另一种身份验证方法。在没有表单例份验证的测试中,我设置了一个自定义 AuthorizeAttribute,可以在我的 Controller 中使用它,如下所示:

[ApiAuth]
public IEnumerable<string> Get() {
// Return the resource
}

AuthorizeAttribute 看起来像这样:

public class ApiAuthAttribute : AuthorizeAttribute {
public override void OnAuthorization(HttpActionContext context) {
// Authenticate the request with a HMAC-based approach
}
}

这在孤立的情况下工作得很好,但我不知道如何允许这两种身份验证方法。如果表单例份验证不起作用(或相反,无论起作用),我希望将 ApiAuth 作为后备,但如果我应用 [ApiAuth] 属性,则仅使用该属性,普通用户无法访问 api。

那么,我如何使用多种身份验证方法,要么使用其中一种作为另一种失败时的后备,要么配置服务器,以便 Windows 客户端可以通过 MVC 应用程序以外的其他方式调用 API,同时仍然为两种类型的客户端保留相同的 API 调用?

谢谢。

<小时/>

编辑:我可能采取的一种方法是让 Windows 客户端使用表单例份验证(类似于 this )进行身份验证,但这看起来很像黑客,我会宁愿使用其他方法。

最佳答案

FormAuthentication可以通过多种方式实现。过去,我们使用 FormAuthentication Ticket

现在,您可以使用 Owin Middleware 进行基于声明的身份验证,它基本上是 ASP.Net Identity 的精简版本。

ApiAuthAttribute中对用户进行身份验证后,您将创建Principal对象。

Web.config

您不应该使用<authorization> ASP.Net MVC 中的标记。相反,您想使用过滤器

<authentication mode="Forms">
<forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>

ApiAuthAttribute

public class ApiAuthAttribute : AuthorizeAttribute
{
public override void OnAuthorization(HttpActionContext context)
{
// Authenticate the request with a HMAC-based approach

// Create FormAuthentication after custom authentication is successful
if (!HttpContext.Current.User.Identity.IsAuthenticated)
{
User user = new User {Id = "1234", UserName = "johndoe",
FirstName = "John", LastName = "Doe"};

// This should be injected using IoC container.
var service = new OwinAuthenticationService(
new HttpContextWrapper(HttpContext.Current));
service.SignIn(user);
}
}
}

身份验证

public class User
{
public string Id { get; set; }
public string UserName { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}

public interface IAuthenticationService
{
void SignIn(User user);
void SignOut();
}

public class OwinAuthenticationService : IAuthenticationService
{
private readonly HttpContextBase _context;
private const string AuthenticationType = "ApplicationCookie";

public OwinAuthenticationService(HttpContextBase context)
{
_context = context;
}

public void SignIn(User user)
{
IList<Claim> claims = new List<Claim>
{
new Claim(ClaimTypes.Sid, user.Id),
new Claim(ClaimTypes.Name, user.UserName),
new Claim(ClaimTypes.GivenName, user.FirstName),
new Claim(ClaimTypes.Surname, user.LastName),
};

/*foreach (Role role in user.Roles)
{
claims.Add(new Claim(ClaimTypes.Role, role.Name));
}*/

ClaimsIdentity identity = new ClaimsIdentity(claims, AuthenticationType);

IOwinContext context = _context.Request.GetOwinContext();
IAuthenticationManager authenticationManager = context.Authentication;

authenticationManager.SignIn(identity);
}

public void SignOut()
{
IOwinContext context = _context.Request.GetOwinContext();
IAuthenticationManager authenticationManager = context.Authentication;

authenticationManager.SignOut(AuthenticationType);
}
}

Startup.cs

[assembly: OwinStartup(typeof(YOUR_APPLICATION.Startup))]
namespace YOUR_APPLICATION
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "ApplicationCookie",
LoginPath = new PathString("/Account/Login")
});
}
}
}

关于asp.net - 使用另一种身份验证方法进行外部 api 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39183351/

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